- 准备好ActiveMQ
- 官网下载ActiveMQ: http://activemq.apache.org/download.html
- 下载之后,解压缩到当前目录,进入到解压缩后的目录中/bin/,执行activemq start 命令启动ActiveMQ,打开浏览器,输入http://localhost:8161/admin/ 进入ActiveMQ管理页面,默认有两个登录用户admin user 密码账号一样,如需修改,可以到ActiveMQ目录下的conf/ 目录下,打开jetty-realm.properties文件设置。
ActiveMQ默认的端口是8161,至此,ActiveMQ安装好。
- 设置Tomcat容器中队列相关参数
进入Tomcat安装目录,进入conf/ 目录打开context.xml,在<Context>标签中添加两个<Resource>标签,一个是ActiveMQ消息队列的连接工厂,一个是消息队列的队列名称
<Resource name="queue/connectionFactory"
auth="Container"
type="org.apache.activemq.ActiveMQConnectionFactory"
description="JMS Connection Factory"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
brokerURL="tcp://localhost:61616"
brokerName="LocalActiveMQBroker" />
<Resource name="queue/queue0"
auth="Container"
type="org.apache.activemq.command.ActiveMQQueue"
description="My Queue"
factory="org.apache.activemq.jndi.JNDIReferenceFactory"
physicalName="TomcatQueue" />
配置完毕,关闭结束。
JNDI(Java Naming and Directory Interface)是一个标准规范,类似于JDBC,JMS等规范,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口。J2EE 规范要求所有 J2EE 容器都要提供 JNDI 规范的实现,因此Tomcat就实现了JNDI 规范。
上面的操作就是配置Tomcat的JNDI。
- 开发消息队列的web应用,使用Tomcat运行。
开发IDE:Eclipse,
- 设置Eclipse中的服务器为本地自己安装的Tomcat,也就是上面配置了Resource标签的那个Tomcat。步骤如下图
- 创建Maven工程,选择archetypes为webapp,项目名称为ActiveMQDemo,打开pom.xml文件添加ActiveMQ的依赖:
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.15.8</version>
</dependency>
创建消息生产者servlet类:
package com.test.activemq;
import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.DeliveryMode;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueSender;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Send")
public class Send extends HttpServlet {
private static final long serialVersionUID = 1L;
public Send() {
super();
// TODO Auto-generated constructor stub
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
try{
// get the initial context
InitialContext context = new InitialContext();
// lookup the queue object
Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");
// lookup the queue connection factory
QueueConnectionFactory conFactory = (QueueConnectionFactory) context.lookup("java:comp/env/queue/connectionFactory");
// create a connection
QueueConnection queueConn = conFactory.createQueueConnection();
// create a queue session
QueueSession queSession = queueConn.createQueueSession(false,Session.DUPS_OK_ACKNOWLEDGE);
// create a queue sender
QueueSender queSender = queSession.createSender(queue);
queSender.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
// create a simple message to say "Hello World"
TextMessage message = queSession.createTextMessage("Hello World");
// send the message
queSender.send(message);
// print what we did
out.write("Message Send: " + message.getText());
// close the queue connection
queueConn.close();
} catch(Exception e){
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
创建消息消费者servlet类
package com.test.activemq;
import java.io.IOException;
import java.io.PrintWriter;
import javax.jms.Queue;
import javax.jms.QueueConnection;
import javax.jms.QueueConnectionFactory;
import javax.jms.QueueReceiver;
import javax.jms.QueueSession;
import javax.jms.Session;
import javax.jms.TextMessage;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/Receive")
public class Receive extends HttpServlet {
public Receive() {
super();
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
PrintWriter out = resp.getWriter();
try {
// get the initial context
InitialContext context = new InitialContext();
// lookup the queue object
Queue queue = (Queue) context.lookup("java:comp/env/queue/queue0");
// lookup the queue connection factory
QueueConnectionFactory conFactory = (QueueConnectionFactory) context
.lookup("java:comp/env/queue/connectionFactory");
// create a queue connection
QueueConnection queConn = conFactory.createQueueConnection();
// create a queue session
QueueSession queSession = queConn.createQueueSession(false,
Session.AUTO_ACKNOWLEDGE);
// create a queue receiver
QueueReceiver queReceiver = queSession.createReceiver(queue);
// start the connection
queConn.start();
// receive a message
TextMessage message = (TextMessage) queReceiver.receive();
// print the message
out.write("Message Received: " + message.getText());
// close the queue connection
queConn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
- 将项目部署到Tomcat
File-->New-->Other,搜索Server,然后点next,直到下面弹框出现,按步骤操作最后finish,
点击Windows-->Show View-->Other,搜索Server,出现Server工作台,选择创建好的TomcatServer,右键启动。http://localhost/ActiveMQDemo 访问到这个项目的首页,http://localhost/ActiveMQDemo/Send生成消息到ActiveMQ,http://localhost/ActiveMQDemo/Receive获取一个ActiveMQ消息。
2019-3-15更新
上面的开发方式搞得太负杂了,下面使用Idea 做了一个SpringBoot的Demo
初始化一个SpringBoot项目,在项目中的pom.xml文件中添加以下依赖
<dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-all</artifactId> <version>5.15.8</version> </dependency>
<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency>
创建消息生产者:
package com.example.activemqdemo; import org.apache.activemq.ActiveMQConnectionFactory; import org.junit.Test; import javax.jms.*; /** * Created with IDEA * author : charberming * Date : 2019/3/25 0025 * Time : 上午 11:22 * 消息队列生产者 */ public class ActiveMQProducer { @Test public void testProduceMQ() throws Exception { // 连接工厂 // 使用默认用户名、密码、路径 // 路径 tcp://host:61616 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); // 获取一个连接 Connection connection = connectionFactory.createConnection(); // 建立会话 设置状态true开启事务 Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE); // 创建队列或者话题对象 Queue queue = session.createQueue("HelloWorld"); // Topic helloTopic = session.createTopic("HelloTopic"); // 创建生产者 或者 消费者 MessageProducer producer = session.createProducer(queue); // 发送消息 for (int i = 0; i < 10; i++) { producer.send(session.createTextMessage("你好,activeMQ:" + i)); } // 提交事务操作 session.commit(); } }
创建消费者:
package com.example.activemqdemo; import org.apache.activemq.ActiveMQConnectionFactory; import org.junit.Test; import javax.jms.*; /** * Created with IDEA * author : charberming * Date : 2019/3/25 0025 * Time : 上午 11:31 * 消费者 */ public class ActiveMQConsumer { @Test // 直接消费 public void testCosumeMQ() throws Exception { // 连接工厂 // 使用默认用户名、密码、路径 // 路径 tcp://host:61616 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); // 获取一个连接 Connection connection = connectionFactory.createConnection(); // 开启连接 connection.start(); // 建立会话 // 第一个参数,是否使用事务,如果设置true,操作消息队列后,必须使用 session.commit(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列或者话题对象 Queue queue = session.createQueue("HelloWorld"); // 创建消费者 MessageConsumer messageConsumer = session.createConsumer(queue); while (true) { TextMessage message = (TextMessage) messageConsumer.receive(10000);/*超时时间 10000*/ if (message != null) { System.out.println(message.getText()); } else { break; } } } @Test // 使用监听器消费 public void testCosumeMQ2() throws Exception { // 连接工厂 // 使用默认用户名、密码、路径 // 路径 tcp://host:61616 ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(); // 获取一个连接 Connection connection = connectionFactory.createConnection(); // 开启连接 connection.start(); // 建立会话 // 第一个参数,是否使用事务,如果设置true,操作消息队列后,必须使用 session.commit(); Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); // 创建队列或者话题对象 Queue queue = session.createQueue("HelloWorld"); // 创建消费者 MessageConsumer messageConsumer = session.createConsumer(queue); messageConsumer.setMessageListener(new MessageListener() { // 每次接收消息,自动调用 onMessage @Override public void onMessage(Message message) { TextMessage textMessage = (TextMessage) message; try { System.out.println(textMessage.getText()); } catch (JMSException e) { e.printStackTrace(); } } }); while (true) { // 不能让junit线程死掉 } } }
这个demo比较简单