我目前正在阅读有关JMS
的内容,经过一些文章后,我的头脑中存在一些关于持久订阅和非持久性消息的混淆。让我们从:
http://www2.sys-con.com/itsg/virtualcd/java/archives/0604/chappell/index.html - 它说:
如果非持久性消息用于断开连接的持久性消息 订阅者,消息服务器将消息保存到磁盘,就像它一样 是一个持久的消息。在这种情况下的区别 持久性和非持久性消息是微妙的,但非常重要。 对于非持久性消息,JMS提供程序可能会失败 有机会将消息写入磁盘代表 断开的持久用户。消息可能会丢失
另一个来源: http://openmessaging.blogspot.com/2009/04/durable-messages-and-persistent.html说的完全不同:
如果此主题有任何持久订阅,则为 消息将发送给那些处于活动状态的持久订阅者。对于 那些不活动的持久订阅,是邮件的副本 保存在内存中,并在下次激活时发送给他们。
如果重新启动代理,此保存的消息将丢失。的由于 非持久性消息不保存在磁盘上,代理重启意味着 任何尚未收到的非活动持久订阅 消息将错过消息。
那么,真相是什么:)?
答案 0 :(得分:2)
一般来说:
1)非持久性消息不会保存到磁盘。因此,他们不会重新启动消息传递提供程序。
2)另一方面,持久性消息被保存到磁盘。因此,它们会重新启动消息传递提供程序。
大多数消息提供商都遵循上述概念。但正如您所指出的,存在一些特定于实现的偏差。例如,IBM MQ具有“半持久”消息(NPMCLASS
属性)的概念。虽然这些是“非持久性”消息,但它们可以正常关闭并重新启动MQ消息传递提供程序。如果MQ异常结束,则“半持久”消息将丢失。
因此,它归结为实施细节。
希望这会有所帮助。
答案 1 :(得分:1)