创建JmsConsumer类,前面的连接部分和JmsProducer类似,为了方便查看,我把代码放上来。
package com.wsy.activemq.queue;
import org.apache.activemq.ActiveMQConnectionFactory;
import javax.jms.*;
public class JmsConsumer {
public static final String ACTIVEMQ_URL = "tcp://192.168.0.101:61616";
public static final String QUEUE_NAME = "queue01";
public static void main(String[] args) throws JMSException {
// 创建连接工厂,按照给定的url地址采用默认的用户名和密码
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(ACTIVEMQ_URL);
// 通过连接工厂,获取Connection并启动
Connection connection = activeMQConnectionFactory.createConnection();
connection.start();
// 创建Session
// 有两个参数,第一个是事务,第二个是签收,后面详细介绍
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 创建目的地(目的地有两个子接口,分别是Queue和Topic)
Queue queue = session.createQueue(QUEUE_NAME);
// 创建消费者,指明从queue取消息
MessageConsumer messageConsumer = session.createConsumer(queue);
while (true) {
// 因为向队列中存放的是TextMessage的实例,所以取出来的时候,也要用TextMessage的实例来接收
// 这里的receive()方法表示一直等待,如果给它传一个long类型的毫秒数,表示consumer等待超时时间
TextMessage textMessage = (TextMessage) messageConsumer.receive();
if (textMessage != null) {
System.out.println("消费者消费:"+textMessage.getText());
} else {
break;
}
}
// 按照资源打开的相反顺序关闭资源
messageConsumer.close();
session.close();
connection.close();
}
}
登录到ActiveMQ的管理端,查看Queue中的数据,然后再执行JmsConsumer的main方法,再次查看Queue中的数据,如下图,可以看到,待处理的消息变成了0条,消费者的数量是1,入队的消息是3,出队的消息是3。再看JmsConsumer,发现它还在运行中,一直再等待消息。
当我把JmsConsumer程序停止后,再去刷新Queue的界面,发现消费者的数量就变成0了。