消息中间件的 Topic 机制,一般情况下没有保存消息。一没连接,再次连接时不会收到失去连接期间的消息。这种机制在对消息可丢失的场景应用好。当然消息中间件都有保存消息的功 能。Jms 规范里定义了 DurableSubscriber。
Jms 规范中的关于持久化订阅的一小段:
非持久化订阅持续到它们订阅对象的生命周期。这意味着,客户端只能在订阅者活动时看到相关主题发布的消息。如果订阅者不活动,它会错过相关主题的消息。
如果花费较大的开销,订阅者可以被定义为durable(持久化的)。持久化的订阅者注册一个带有JMS保持的唯一标识的持久化订阅 (subscription)。带有相同标识的后续订阅者会再续前一个订阅者的订阅状态。如果持久化订阅没有活动的订阅者,JMS会保持订阅
消息,直到消息被订阅接收或者过期。
看 Jms 规范看得晕,看下关键代码好理解。
要用持久化订阅,发送消息者要用 DeliveryMode.PERSISTENT 模式发现,在连接之前设定。订阅者要设置客户端名,调用 session.createDurableSubscriber。
发送者:
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(); //设置完了后,才连接
接收者:
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); 作对比。
使用中觉得到,消息服务器为每一个离线注册的客户端保存独立的消息,它们上线时,再发给出去。
这种机制就像听课:老师在讲课,带有录音机的学生就可以签到后逃课,持久订阅者就是带有录音机的学生。
相关推荐
详细的描述了测试JMS消息持久订阅者的过程和程序
JMS中topic和queue两种实现方式
JMS消息发送及订阅。详细代码,很简单。
一个jms activemq Topic 消息实例 关于jms JMS 是接口,相当于jdbc ,要真正使用它需要某些厂商进行实现 ,即jms provider 常见的jms provider 有 ActiveMQ JBoss 社区所研发的 HornetQ (在jboss6 中默认即可以...
JMS 操作IBM MQ,实现订阅发布模式!包含完整的JAR包以及测试文件。
openjms实现jms消息发布于订阅 openjms实现jms消息发布于订阅 openjms实现jms消息发布于订阅 openjms实现jms消息发布于订阅 openjms实现jms消息发布于订阅
JMS之ActiveMQ 点对点+发布/订阅
ESB应用JMS_Topic,有图片, JBoss_ESB
JMS实现的 广播 和 信息发送 ,希望对你有用
weblogic中使用JMS发送和接受消息(Queue and TOPIC)
JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS(JMS
JMS Topic(1) 1.消息的生产者 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import javax.jms.JMSException; import javax.jms.ObjectMessage; import javax.jms...
javax.jms.Topic.class javax.jms.MapMessage.class javax.jms.ObjectMessage.class javax.jms.StreamMessage.class javax.jms.TextMessage.class javax.jms.MessageListener.class javax.jms.MessageProducer.class...
MQ JMS 发布订阅配置 代码 文档,带有截图 以及java代码
jms培训PPT 适合学习JMS的同行们
##################################1、工程说明##################...3) 实现了普通队列消息发送与监听,实现了基于TOPIC的消息发布与订阅 4) IBM-MQ无需提前创建主题,TongLink需要提前创建主题以及对应的虚拟队列;
javax.jms.BytesMessage.class javax.jms.Connection.class javax.jms.ConnectionConsumer.class javax.jms.ConnectionFactory.class javax.jms.ConnectionMetaData.class javax.jms.DeliveryMode.class javax.jms....
自己写的一个JMS的demo,包含点对点,发布/订阅的例子,以及DeliverMode的测试,还有持久的订阅者,解决topic模式下消息接收者离线后接收不到离线时错过的消息的问题。
三分关于jms的入门文档,适合初步了解jms的基本概念,和浅层的架构体系。