主题

时间:2017-04-18 19:44:30

标签: jms activemq

我有一个问题是,邮件是否会在主题中保留,我从this post获得了大部分答案。

但是这种情况怎么样 - 假设经纪人已经开始新鲜,并且一些发行商已经开始向某个主题发送消息,现在将来一些持久订阅者将与此主题联系但是目前没有持久订阅者,所以在经纪人的情况下重新启动发布者发送到该主题的所有消息,直到现在都将丢失?

我尝试了上述情况,确实所有消息都丢失了。此外,我尝试了这种情况 - 我有一个活跃的持久订阅者,它能够将消息推送到主题,然后它下降,同时更多消息被推送到主题,然后代理重新启动,最后所有这些增量消息失去了。

所以,这基本上意味着在TOPIC消息无法持久的情况下,因为与前面提到的那篇文章中的答案相反,拥有持久的订阅者没有效果,因为如果有活跃的持久订阅者那么消息将立即由它消耗,如果没有活动的持久订阅者并且代理重新启动,则消息将丢失。

那么,底线是,如果TOPIC消息无法持久存在,或者我的理解/测试错误了吗?

2 个答案:

答案 0 :(得分:2)

对于干净的代理启动,如果主题上没有脱机持久订阅,则代理不会保留消息,即使它们是以Persistent的传递模式发送的。如果您随后添加一个持久的订阅消息,这些消息将作为持久性发送写入存储,并且如果持久订阅处于脱机状态,则它们将被保留直到消耗,或者如果存在正在读取并确认它们的持久订阅消费者则将其删除。

如果您没有使用Persistent的传递模式发送消息,那么即使存在持久的订阅,它们也永远不会被持久化。一旦持久订阅被取消订阅,代理就会返回到不存储主题消息,即使它们被标记为持久消息。

鉴于您看到的行为最好的猜测是您的发送模式是非持久性的。

答案 1 :(得分:2)

这里需要一点清晰。

1)没有订阅者的经纪人 - 所有消息都被经纪人丢弃。

2)具有在线持久订户的代理 - 消息(持久性和非持久性)被传递到订户的存储器,通常是队列,然后由订户消费。

3)具有离线持久订户的代理 - 消息(持久性和非持久性)被传递到订户的存储。如果代理发生故障,则所有非持久性消息都将丢失。但是,当代理重新启动时,将恢复所有持久性消息。

4)具有在线非持久订户的经纪人 - 消息(持久性和非持久性)被传递给消费者。如果订户脱机,则不会向消费者传递任何消息,并且代理不会缓存任何消息。

IBM MQ提供了一个名为Retain Publication的选项,用于保留在主题上发布的最新消息的副本。这样任何迟到的加入者都会收到这条最新消息。