当DurableSubscriber的订阅者,订阅了一个topic , 然后该订阅者下线了,消息的发送者往topic发送了 一条或者多条消息,只要该DurableSubscriber上线,该DurableSubscriber依然可以接受到topic发送的消息(类似于我们订阅了微信公众号,只要我们订阅了微信公众号,当公众号发送了一篇或者多篇文章,就算我们一直没在线,当我们上线了我们依然可以接受到这些文章)
代码示例:
订阅者代码:(我们可以启动多个订阅者,要修改订阅者编号即可)
public class ActivemqConsumer {
static String BROKER_URL = "tcp://192.168.72.129:61616";
static String TOPIC_NAME = "topic";
public static void main(String[] args) throws JMSException {
// 1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
// 2.创建连接并启动
Connection connection = activeMQConnectionFactory.createConnection();
// 设置该订阅者的编号
connection.setClientID("client01");
// 3.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.创建目的地
Topic topic = session.createTopic(TOPIC_NAME);
// 创建订阅者
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "remark");
connection.start();
while (true) {
TextMessage message = (TextMessage) topicSubscriber.receive();
if (message != null) {
System.out.println(message.getText());
} else {
break;
}
}
session.close();
connection.close();
}
}
消息提供者
public class ActivemqConsumer {
static String BROKER_URL = "tcp://192.168.72.129:61616";
static String TOPIC_NAME = "topic";
public static void main(String[] args) throws JMSException {
// 1.创建连接工厂
ActiveMQConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory(BROKER_URL);
// 2.创建连接并启动
Connection connection = activeMQConnectionFactory.createConnection();
// 设置该订阅者的编号
connection.setClientID("client01");
// 3.创建session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// 4.创建目的地
Topic topic = session.createTopic(TOPIC_NAME);
// 创建订阅者
TopicSubscriber topicSubscriber = session.createDurableSubscriber(topic, "remark");
connection.start();
while (true) {
TextMessage message = (TextMessage) topicSubscriber.receive();
if (message != null) {
System.out.println(message.getText());
} else {
break;
}
}
session.close();
connection.close();
}
}
测试:(先启动订阅者,在启动消息提供者)
- 先启动2个订阅者,分别为client01 和 client01,表示该2个订阅者订阅了 名为“topic”的主题
- 下线该2个订阅者(即停止代码运行)
- 启动消息提供者,
- 在次启动2个订阅者,
运行结果,2个订阅者都输出结果:
分析结果:
- 只有订阅者订阅了一次主题,不管订阅者是否上下线,只要往主题发送消息,订阅者一上线,就能收到所有的消息。