消息中间件的 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 消息持久订阅者测试知识点解析 #### 一、引言 Java消息服务(JMS)是Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。JMS定义了应用程序如何...
总结来说,实现ActiveMQ的Topic持久订阅涉及创建Topic、设置持久订阅者、发送和接收消息,以及管理订阅。理解这些概念和操作,有助于在实际项目中构建可靠的分布式系统通信架构。在开发过程中,结合源码阅读和工具...
本篇文章将深入探讨如何在Spring环境下利用Java消息服务(JMS)实现队列(Queue)和持久订阅(Persistent Subscription)主题(Topic)的功能。我们将从源码层面解析其工作原理,并提供一些实用工具的使用方法。 ...
1. **消息模型**:JMS支持两种主要的消息传递模型——点对点(Queue)和发布/订阅(Topic)。点对点模式中,消息从一个生产者发送到一个队列,然后由一个消费者接收。发布/订阅模式下,消息由发布者发送到主题,多个...
6. **持久订阅和临时订阅**: 在JMS中,订阅可以是持久的或临时的。持久订阅确保即使消费者在消息发布时离线,也能在重新连接时接收到之前错过的消息。临时订阅则只在消费者在线时有效。 7. **消息选择器**: 如果...
JMS主要提供了两种消息模式:主题(Topic)和队列(Queue),这两种模式在实现方式和功能上有所不同。 1. 主题(Topic): - **发布/订阅模型**:主题基于发布/订阅模型,其中多个生产者可以发布消息到一个特定的...
2. **创建订阅者**:在Java代码中,消费者需要通过`MessageConsumer`接口的`createDurableSubscriber`方法创建一个持久订阅。订阅时需提供一个唯一的名字,以便于识别和恢复订阅状态。 ```java Topic topic = ...
本文将详细介绍如何在WebLogic中使用JMS来创建Queue(队列)和TOPIC(主题)并进行消息的发送与接收。 ### 一、JMS基本概念 1. **Queue(队列)**:队列是一种点对点的消息传递模型,其中每个消息只会被一个消费者...
发布/订阅模型基于主题(Topic)进行通信。在这里,生产者发布消息到一个主题,多个消费者可以订阅这个主题以接收消息。与点对点模型不同,发布/订阅模型支持一对多的消息传递,即一条消息可以被多个订阅者接收。 -...
这通常通过`createDurableSubscriber()`方法完成,如果需要持久订阅(即使订阅者断开连接也能接收到消息)。 ```java MessageConsumer consumer = session.createDurableSubscriber(topic, "Subscriber1"); ``` ...
- **主题(Topic)**: 支持发布/订阅模式,多个消费者可以订阅同一个主题,当一个生产者发送消息到主题时,所有订阅该主题的消费者都能接收到消息。 - **队列(Queue)**: 支持点对点模型,每个消息只能被一个消费...
6. **订阅Topic**:消费者通过MessageConsumer订阅Topic,可以设置持久化订阅(Durable Subscription)来保证即使消费者离线也能接收到消息。 7. **消息过滤**:在订阅时,可以使用Selector来过滤接收到的消息,只...
Durable Subscription 是一种持久化的订阅方式,JMS Provider 将会费点儿脑筋来记下这个 Durable Subscription 的消息订阅者是谁,即使当消息到达之后,该 Durable Subscription 消息订阅者不在,JMS Provider 也会...
而主题(Topic)则支持一对多广播,多个订阅者可以接收到相同的消息,适合发布/订阅模式。 集成Spring和ActiveMQ的第一步是添加依赖。在Maven项目中,你需要在`pom.xml`文件中引入Spring和ActiveMQ的相关依赖。例如...
订阅者需要保持活跃状态来接收消息,或者创建持久订阅以在离线时接收消息。 **消息传递方式** JMS提供两种消息传递模式: - **NON_PERSISTENT**:非持久性消息,最多投递一次,适合不需要确保消息完整到达的情况...
2. **消息队列(Message Queue)与主题(Topic)**: JMS提供了两种消息模型:点对点(Point-to-Point,P2P)和发布/订阅(Publish/Subscribe)。在P2P模型中,消息被发送到一个消息队列,每个消息只被一个消费者接收...
WebLogic 9.2配置JMS(Java Message Service)涉及一系列步骤,主要目的是为了实现分布式消息传递,包括点对点的Queue模式和发布/订阅的Topic模式。在本例中,我们将专注于配置发布/订阅模式,即Topic。以下是详细的...
4. **持久订阅者(Durable Subscription)**:在发布/订阅模型中,如果一个订阅者在发布消息时离线,那么它可能会错过这些消息。持久订阅者解决了这个问题,通过在订阅者离线时保留其状态,当订阅者重新上线时,它...
`javax.jms.jar` 文件中包含了如`javax.jms.Queue`, `javax.jms.Topic`, `javax.jms.MessageProducer`, `javax.jms.MessageConsumer`, `javax.jms.ConnectionFactory`等关键接口,以及其他辅助类和异常类,开发者...