上一讲我们一起学习了如何使用ActiveMQ来发送点对点消息,这一讲我们就来学习下如何接收消息。
首先,我们在itheima-activemq工程中新建一个类,并在该类中添加一个测试方法,如下图所示。
为了方便大家复制,现将以上QueueCustomer类的代码贴出,如下所示。
package com.itheima.activemq.queue;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageListener;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TextMessage;
import org.apache.activemq.ActiveMQConnectionFactory;
import org.junit.Test;
public class QueueCustomer {
@Test
public void recieve() throws Exception {
// 1. 创建一个连接工厂,即ConnectionFactory
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.81.135:61616");
// 2. 通过工厂获取连接对象
Connection connection = factory.createConnection();
// 3. 开启连接
connection.start();
// 4. 创建一个Session对象,提供接收消息等方法
/*
* 第一个参数:表示是否开启分布式事务(JTA),一般不开启,即设置为false
* 第二个参数:就是设置消息的应答模式,如果第一个参数为false时,那么第二个参数的设置才有意义,一般用的是自动应答
*/
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 5. 创建接收消息的一个目的地
Queue queue = session.createQueue("queue-test");
// 6. 创建一个消费者,来接收消息
MessageConsumer consumer = session.createConsumer(queue);
// 7. 接收消息并打印,接收消息一共有两种方式
// 第一种方式
// 如果在这个时间内,只是调用receive方法,那么它只接收了一次,接收了一次,那么其他人就接收不了了,所以这个时候我们就要弄一个循环
/*
while (true) {
Message message = consumer.receive(1000000); // 设置接收消息的超时时间(毫秒),在这个时间内,如果有消息发送过来,那么都能接收到,超过这个时间就断了
// 如果接收的消息为null,即没有接收到消息,就跳出循环
if (message == null) {
break;
}
if (message instanceof TextMessage) {
TextMessage message2 = (TextMessage) message;
System.out.println("接收的消息为:" + message2.getText());
}
}
*/
// 第二种方式,在生产环境中,一般是不用第一种方式的,因为用这种方式,就必须得一直等着。
// System.out.println("start");
// 设置一个监听器
// 这里其实是开辟了一个新的线程,其实它就是一个子线程(涉及到了多线程的应用)
consumer.setMessageListener(new MessageListener() {
// 当有消息的时候,就会执行以下的逻辑
@Override
public void onMessage(Message message) {
if (message instanceof TextMessage) {
TextMessage message2 = (TextMessage) message;
try {
System.out.println("接收的消息为:" + message2.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
// System.out.println("end");
Thread.sleep(199999); // 让主线程一直等待,一直监听,只要这个主线程没挂,它就一直可以监听到消息的发送
// 8. 关闭资源
consumer.close();
session.close();
connection.close();
}
}
执行上面的测试方法,执行成功之后,可以看到正确输出了我们上文发送的消息,如下图所示,这时程序并没有结束(下图中还有一个红色运行标志)。
我们再发送两条不同的消息,看看是不是能马上接收到新的消息,如下图所示,发现只要一发送消息,接收端便立刻会显示出发送的消息。
如果我们想结束接收消息,那么在Console控制台直接点击红色运行标志即可,如下图所示。
我们再来看下ActiveMQ的管理后台,这时点击Queues
,便可以看到如下图所示界面,我们发送了3条消息,消费了3条消息,因此当前待发送消息数量为0,向队列中添加了3条信息,又取出了3条信息,最后消费者被我们关闭了,因此当前消费者数量为0。
至此,点对点发送与接收消息,我已讲完。有任何疑问,可以找我讨论。