JSP 整合 ActiveMQ 实现消息队列通信示例
在分布式系统中,消息队列是一种常用的通信机制,它能够实现异步通信,提高系统的可用性和可扩展性。ActiveMQ 是一个开源的消息中间件,支持多种协议,包括 JMS(Java Message Service)。JSP(JavaServer Pages)是一种动态网页技术,可以与 JavaBean 和 Java Servlet 一起使用。本文将介绍如何使用 JSP 和 ActiveMQ 实现消息队列通信。
环境准备
在开始之前,我们需要准备以下环境:
1. Java Development Kit (JDK)
2. Apache Maven
3. ActiveMQ Server
4. Web 服务器(如 Apache Tomcat)
确保所有环境都安装正确,并且版本兼容。
ActiveMQ 安装与配置
1. 下载 ActiveMQ 服务器:从 [ActiveMQ 官网](http://activemq.apache.org/download.html) 下载适合您操作系统的 ActiveMQ 服务器。
2. 解压下载的文件,并启动 ActiveMQ 服务器。在 Windows 系统中,双击 `binactivemq.bat` 文件;在 Linux 系统中,使用 `./bin/activemq` 命令。
3. 打开浏览器,访问 `http://localhost:8161/admin`,使用默认用户名 `admin` 和密码 `admin` 登录 ActiveMQ 控制台。
Maven 项目配置
1. 创建一个新的 Maven 项目,并添加以下依赖:
xml
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.10</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
</dependencies>
2. 在 `src/main/webapp/WEB-INF/web.xml` 文件中配置 JSP:
xml
<web-app>
<servlet>
<servlet-name>MessageServlet</servlet-name>
<servlet-class>com.example.MessageServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MessageServlet</servlet-name>
<url-pattern>/message</url-pattern>
</servlet-mapping>
</web-app>
JSP 代码实现
发送消息
创建一个名为 `sendMessage.jsp` 的 JSP 文件,用于发送消息:
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Send Message</title>
</head>
<body>
<form action="message" method="post">
<label for="message">Message:</label>
<input type="text" id="message" name="message" required>
<input type="submit" value="Send">
</form>
</body>
</html>
接收消息
创建一个名为 `MessageServlet.java` 的 Java 类,用于接收消息:
java
package com.example;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.jms.;
import org.apache.activemq.ActiveMQConnectionFactory;
@WebServlet("/message")
public class MessageServlet extends HttpServlet {
private ConnectionFactory connectionFactory;
private Connection connection;
private Session session;
private Destination destination;
@Override
public void init() throws ServletException {
try {
connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
destination = session.createQueue("MessageQueue");
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String message = request.getParameter("message");
try {
MessageProducer producer = session.createProducer(destination);
TextMessage textMessage = session.createTextMessage(message);
producer.send(textMessage);
response.getWriter().println("Message sent successfully!");
} catch (JMSException e) {
e.printStackTrace();
}
}
@Override
public void destroy() {
try {
if (connection != null) {
connection.close();
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
消费消息
创建一个名为 `receiveMessage.jsp` 的 JSP 文件,用于消费消息:
jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Receive Message</title>
</head>
<body>
<h1>Received Messages:</h1>
<ul>
<%
String[] messages = (String[]) getServletContext().getAttribute("messages");
if (messages != null) {
for (String message : messages) {
out.println("<li>" + message + "</li>");
}
}
%>
</ul>
</body>
</html>
创建一个名为 `MessageConsumerServlet.java` 的 Java 类,用于消费消息:
java
package com.example;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.jms.;
import org.apache.activemq.ActiveMQConnectionFactory;
@WebServlet("/messageConsumer")
public class MessageConsumerServlet extends HttpServlet {
private ConnectionFactory connectionFactory;
private Connection connection;
private Session session;
private MessageConsumer consumer;
@Override
public void init() throws ServletException {
try {
connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
connection = connectionFactory.createConnection();
connection.start();
session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Destination destination = session.createQueue("MessageQueue");
consumer = session.createConsumer(destination);
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
try {
String text = ((TextMessage) message).getText();
String[] messages = (String[]) getServletContext().getAttribute("messages");
if (messages == null) {
messages = new String[0];
}
String[] newMessages = new String[messages.length + 1];
System.arraycopy(messages, 0, newMessages, 0, messages.length);
newMessages[messages.length] = text;
getServletContext().setAttribute("messages", newMessages);
} catch (JMSException e) {
e.printStackTrace();
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void destroy() {
try {
if (connection != null) {
connection.close();
}
} catch (JMSException e) {
e.printStackTrace();
}
}
}
总结
本文介绍了如何使用 JSP 和 ActiveMQ 实现消息队列通信。通过创建发送和接收消息的 JSP 页面,以及相应的 Java Servlet,我们实现了消息的发送和消费。在实际应用中,可以根据需求调整消息队列的配置和消息处理逻辑。希望本文能对您有所帮助。
Comments NOTHING