【发布时间】:2016-01-03 08:08:46
【问题描述】:
我有一个 Spring DMLC 形式的主题和相应的订阅者。我的问题与以下情况有关:
消息在主题上发布,订阅者开始处理消息。如果在处理前一条消息时另一条消息到达该主题,新消息是否会在订阅者忙时丢失,或者在处理前一条消息之后处理该消息。
如果答案是第二条消息将在第一条消息之后处理,那么接下来的问题是这个行为是由代理处理还是由订阅者处理。
【问题讨论】:
标签: jms spring-jms jms-topic
我有一个 Spring DMLC 形式的主题和相应的订阅者。我的问题与以下情况有关:
消息在主题上发布,订阅者开始处理消息。如果在处理前一条消息时另一条消息到达该主题,新消息是否会在订阅者忙时丢失,或者在处理前一条消息之后处理该消息。
如果答案是第二条消息将在第一条消息之后处理,那么接下来的问题是这个行为是由代理处理还是由订阅者处理。
【问题讨论】:
标签: jms spring-jms jms-topic
第二条消息会在第一条消息之后处理吗?
是的
这种行为是由代理处理还是订阅者必须处理 这个?
消息的副本将由 Broker 保存,即由 Broker 处理。
还需要注意的是,有两种类型的 JMS 主题订阅者:
(1) 非持久订阅者: 仅当订阅者处于活动状态时,代理才会保留副本(在内存中)。
(2) 持久订阅者: 即使订阅者未处于活动状态,代理也会保留副本(在内存 + 文件系统中)。
请查找以下 oracle 文档:
为确保发布/订阅应用程序接收所有发布的消息, 为发布者使用持久交付模式。此外,使用 订阅者的持久订阅。
Session.createConsumer 方法创建一个非持久订阅者,如果 主题被指定为目的地。非持久订户可以 只接收在它处于活动状态时发布的消息。
https://docs.oracle.com/cd/E19798-01/821-1841/bncgd/index.html
【讨论】:
除非客户端取消订阅(或死亡),否则下一条消息不会丢失 - 您可以使订阅持久化,这意味着即使在这种情况下消息也不会丢失。
这(消息处理)由代理控制,而不是客户端;订阅是否持久取决于客户。
一些代理提供预取功能,在这种情况下,消息可能会在客户端仍在处理当前消息时被发送到客户端,但如果客户端死亡,它仍然不会丢失,因为只有在消息被删除后才会删除它承认。
【讨论】: