activeMQ topic 持久化订阅

ActiveMQ的Topic默认不持久,消息发送后若无订阅者则丢失。持久化订阅者通过clientID和订户名称区分。设置包括设置clientID和创建DurableSubscriber。生产者需设置DeliveryMode为PERSISTENT。文章讨论了两种持久化消费者接收消息的方式,一种是直接接收,不推荐,因为消费者关闭后可能无法接收到新消息;另一种是推荐方式,即使消费者宕机后也能获取到未消费的消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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,持久化消费者也能获取到

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值