关于 Jms Topic 持久订阅
2011-09-05 13:49
274 查看
原文地址:http://blog.chenlb.com/2010/01/jms-topic-durable-subscriber.html
消息中间件的 Topic 机制,一般情况下没有保存消息。一没连接,再次连接时不会收到失去连接期间的消息。这种机制在对消息可丢失的场景应用好。当然消息中间件都有保存消息的功能。Jms 规范里定义了 DurableSubscriber。
Jms 规范中的关于持久化订阅的一小段
看 Jms 规范看得晕(可能被翻译得不好),看下关键代码好理解。
要用持久化订阅,发送消息者要用 DeliveryMode.PERSISTENT 模式发现,在连接之前设定。订阅者要设置客户端名,调用 session.createDurableSubscriber。
Sender:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createTopic("my-topic"); MessageProducer producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.PERSISTENT); //设置保存消息 connection.start(); //设置完了后,才连接
Receiver:
connection.setClientID("client-name"); final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("my-topic"); MessageConsumer consumer = session.createDurableSubscriber(topic, "my-sub-name"); connection.start();
最后,先运行 Receiver,目的是注册这个客户端(好让消息中间件服务器为这个客户保存消息),然后关了这个 Receiver, 启动 Sender,发现消息,再启动 Receiver 就可以收到离线消息。
可以同时启用普通的订阅者:MessageConsumer consumer = session.createConsumer(topic); 作对比。
使用中觉得到,消息服务器为每一个离线注册的客户端保存独立的消息,它们上线时,再发给出去。
这种机制就像听课:老师在讲课,带有录音机的学生就可以签到后逃课,持久订阅者就是带有录音机的学生。
问题:topic持久化是一定要在订阅者先声明需要持久化消息吗?还是在发布端保存消息后,注册的持久化订阅都可以接收离线消息。
消息中间件的 Topic 机制,一般情况下没有保存消息。一没连接,再次连接时不会收到失去连接期间的消息。这种机制在对消息可丢失的场景应用好。当然消息中间件都有保存消息的功能。Jms 规范里定义了 DurableSubscriber。
Jms 规范中的关于持久化订阅的一小段
非持久化订阅持续到它们订阅对象的生命周期。这意味着,客户端只能在订阅者活动 时看到相关主题发布的消息。如果订阅者不活动,它会错过相关主题的消息。 如果花费较大的开销,订阅者可以被定义为durable(持久化的)。持久化的订阅者注 册一个带有JMS保持的唯一标识的持久化订阅(subscription)。带有相同标识的后续订阅 者会再续前一个订阅者的订阅状态。如果持久化订阅没有活动的订阅者,JMS会保持订阅 消息,直到消息被订阅接收或者过期。
看 Jms 规范看得晕(可能被翻译得不好),看下关键代码好理解。
要用持久化订阅,发送消息者要用 DeliveryMode.PERSISTENT 模式发现,在连接之前设定。订阅者要设置客户端名,调用 session.createDurableSubscriber。
Sender:
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createTopic("my-topic"); MessageProducer producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.PERSISTENT); //设置保存消息 connection.start(); //设置完了后,才连接
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Destination destination = session.createTopic("my-topic"); MessageProducer producer = session.createProducer(destination); producer.setDeliveryMode(DeliveryMode.PERSISTENT); //设置保存消息 connection.start(); //设置完了后,才连接
Receiver:
connection.setClientID("client-name"); final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("my-topic"); MessageConsumer consumer = session.createDurableSubscriber(topic, "my-sub-name"); connection.start();
connection.setClientID("client-name"); final Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE); Topic topic = session.createTopic("my-topic"); MessageConsumer consumer = session.createDurableSubscriber(topic, "my-sub-name"); connection.start();
最后,先运行 Receiver,目的是注册这个客户端(好让消息中间件服务器为这个客户保存消息),然后关了这个 Receiver, 启动 Sender,发现消息,再启动 Receiver 就可以收到离线消息。
可以同时启用普通的订阅者:MessageConsumer consumer = session.createConsumer(topic); 作对比。
使用中觉得到,消息服务器为每一个离线注册的客户端保存独立的消息,它们上线时,再发给出去。
这种机制就像听课:老师在讲课,带有录音机的学生就可以签到后逃课,持久订阅者就是带有录音机的学生。
问题:topic持久化是一定要在订阅者先声明需要持久化消息吗?还是在发布端保存消息后,注册的持久化订阅都可以接收离线消息。
相关文章推荐
- Apusic+SpringJMS持久订阅配置及Topic重启后不能接受到信息问题解决
- 如何实现ActiveMQ的Topic的持久订阅。
- 理解JMS规范中的持久订阅和非持久订阅
- ActiveMQ之Topic的持久订阅
- 使用JMS发布订阅topic,传送TextMe 4000 ssage
- JMS学习十一(Spring+ActiveMQ消息持久化,Topic持久化订阅)
- 理解JMS规范中的持久订阅和非持久订阅
- 如何实现ActiveMq的Topic的持久订阅
- JMS学习六(ActiveMQ Topic之持久订阅)
- 如何实现ActiveMQ的Topic的持久订阅。
- JMS持久订阅(DurableSubscribe)模式示例
- [置顶] 理解JMS规范中的持久订阅和非持久订阅
- JMS持久订阅
- spring boot-同时使用jms的Queue(队列)和Topic(发布订阅)
- 【Java.JMS】发布/订阅通信——Topic
- 理解JMS规范中的持久订阅和非持久订阅
- spring jms同时使用queue和持久topic订阅
- 使用JMS发布订阅topic,传递ObjectMessage
- 理解JMS规范中的持久订阅和非持久订阅
- 如何实现ActiveMq的Topic的持久订阅