topic 默认是不存在于MQ服务器中的,一旦发送之后,如果没有订阅,消息则丢失。对于普通消费者来说如果错过了这期的消息那就是错过了,对于持久化消费者,可以获取丢失的消息。
首先,activemq区分消费者,是通过clientID和订户名称来区分的。
持久化消费者:
设置1、connection.setClientID("zhangsan");
设置2、MessageConsumer consumer = session.createDurableSubscriber(topic,"zhangsan");
对于持久化消费者,生产者需要如下设置:
//session 创建 produce
MessageProducer producer = session.createProducer(topic);
//生产者设置持久化, 不设置的话,默认就是持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
public class TopicProduct {
public static void main(String[] args) throws Exception {
//创建工厂
ConnectionFactory facroty = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
//利用工厂创建链接
Connection connection = facroty.createConnection();
//链接开启'
connection.start();
//使用 connection创建一个 session 对象
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//session 创建destination
Topic topic = session.createTopic("topic-test");
//session 创建 produce
MessageProducer producer = session.createProducer(topic);
//生产者设置持久化, 不设置的话,默认就是持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT);
//sesssion 创建message
TextMessage message = session.createTextMessage("hello activemq topic test003");
//发送
producer.send(message);
producer.close();
session.close();
connection.close();
}
}
持久化消费者方式一,直接接受消息消费,不推荐使用
消费者关闭再开启后,生产者发送消息,可能获取不到
10s后,断开链接,消费者再也获取不到生产者发送的消息
Message message = consumer.receive(10000);
public class TpitcCustomer {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
Connection connection = factory.createConnection();
//持久订阅
connection.setClientID("zhangsan");
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
//Queue queue = session.createQueue("queue-test");
Topic topic = session.createTopic("topic-test");
//MessageConsumer consumer = session.createConsumer(topic);
//持久订阅
MessageConsumer consumer = session.createDurableSubscriber(topic,"zhangsan");
while(true){
Message message = consumer.receive(10000);
if(message == null){
break;
}
if(message instanceof TextMessage){
TextMessage textmessage = (TextMessage)message;
System.out.println(textmessage.getText());
}
}
//此处用来模拟用户系统开启状态,这样才能得到订阅的消息
Thread.sleep(300000);
connection.close();
session.close();
connection.close();
}
}
持久化消费者第二中方式:推荐使用
public class TpitcCustomer2 {
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ActiveMQConnectionFactory("tcp://192.168.25.128:61616");
Connection connection = factory.createConnection();
//持久化
connection.setClientID("zhangsan");
connection.start();
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
Topic topic = session.createTopic("topic-test");
//持久化
MessageConsumer consumer = session.createDurableSubscriber(topic,"zhangsan");
consumer.setMessageListener(new MessageListener() {
@Override
public void onMessage(Message message) {
if(message instanceof TextMessage){
TextMessage textMessage = (TextMessage)message;
try {
System.out.println(textMessage.getText());
} catch (JMSException e) {
e.printStackTrace();
}
}
}
});
//此处用来模拟用户系统开启状态,这样才能得到订阅的消息
Thread.sleep(300000);
connection.close();
session.close();
connection.close();
}
}
场景:生产发布 001-004,一开始持久化消费者是启动状态,获取到001和002,当生产者要发布003的时候,持久化消费者宕机,等到生产者003和004发布完之后,持久化消费者启动,此刻获取到之前没有获取到的 003和004
生产者再发送005和006,持久化消费者也能获取到