Jms 主题中的消息持久性

Jms 主题中的消息持久性,jms,activemq,Jms,Activemq,我有一个问题,即一条消息是否会持久存在于某个主题中,我的大部分答案都来自 但这种情况如何?假设代理已重新启动,并且某个发布者已开始向某个主题发送消息,现在,将来一些持久订阅者将连接到此主题,但目前没有持久订阅者,因此在代理重新启动的情况下,发布者发送到该主题的所有消息将丢失 我尝试了上述情况,所有的信息都丢失了。另外,我尝试过这种情况——我有一个活动的持久订阅者,它能够将消息推送到主题,然后它停机,同时更多的消息被推送到主题,然后代理重新启动,最后所有的增量消息都丢失了 所以,这基本上意味着在主

我有一个问题,即一条消息是否会持久存在于某个主题中,我的大部分答案都来自

但这种情况如何?假设代理已重新启动,并且某个发布者已开始向某个主题发送消息,现在,将来一些持久订阅者将连接到此主题,但目前没有持久订阅者,因此在代理重新启动的情况下,发布者发送到该主题的所有消息将丢失

我尝试了上述情况,所有的信息都丢失了。另外,我尝试过这种情况——我有一个活动的持久订阅者,它能够将消息推送到主题,然后它停机,同时更多的消息被推送到主题,然后代理重新启动,最后所有的增量消息都丢失了

所以,这基本上意味着在主题消息无法持久化的情况下,因为与我前面提到的帖子中的答案相反,拥有持久订阅者没有任何效果,因为如果有活动的持久订阅者,那么消息将立即被它消耗,如果没有活动的持久订阅者,并且代理重新启动,那么消息就会丢失


所以,底线是,在主题消息无法持久化的情况下,或者我的理解/测试有误吗?

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

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


鉴于您看到的行为,最好的猜测是您在发送时的传递模式是非持久的

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

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


鉴于您看到的行为,最好的猜测是您在发送时的传递模式是非持久的

这里需要澄清一点

1) 没有订阅者的代理-代理丢弃所有消息

2) 具有在线持久订阅者的代理-消息(持久和非持久)被传递到订阅者的存储器,通常是队列,然后订阅者使用这些存储

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

4) 具有在线非持久订户的代理-消息(持久和非持久)被传递给消费者。若订户离线,则不会将任何消息传递给消费者,代理也不会缓存任何消息


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

这里需要澄清一点

1) 没有订阅者的代理-代理丢弃所有消息

2) 具有在线持久订阅者的代理-消息(持久和非持久)被传递到订阅者的存储器,通常是队列,然后订阅者使用这些存储

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

4) 具有在线非持久订户的代理-消息(持久和非持久)被传递给消费者。若订户离线,则不会将任何消息传递给消费者,代理也不会缓存任何消息

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