jsp 语言 JSP 整合 ActiveMQ 实现消息队列通信示例

JSP阿木 发布于 18 天前 6 次阅读


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,我们实现了消息的发送和消费。在实际应用中,可以根据需求调整消息队列的配置和消息处理逻辑。希望本文能对您有所帮助。