JMS持久性和持久性

时间:2016-09-07 22:10:01

标签: java jms message-queue

我目前正在阅读有关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说的完全不同:

  •   

    如果此主题有任何持久订阅,则为   消息将发送给那些处于活动状态的持久订阅者。对于   那些不活动的持久订阅,是邮件的副本   保存在内存中,并在下次激活时发送给他们。

         

    如果重新启动代理,此保存的消息将丢失。的由于   非持久性消息不保存在磁盘上,代理重启意味着   任何尚未收到的非活动持久订阅   消息将错过消息。

那么,真相是什么:)?

2 个答案:

答案 0 :(得分:2)

一般来说:

1)非持久性消息不会保存到磁盘。因此,他们不会重新启动消息传递提供程序。

2)另一方面,持久性消息被保存到磁盘。因此,它们会重新启动消息传递提供程序。

大多数消息提供商都遵循上述概念。但正如您所指出的,存在一些特定于实现的偏差。例如,IBM MQ具有“半持久”消息(NPMCLASS属性)的概念。虽然这些是“非持久性”消息,但它们可以正常关闭并重新启动MQ消息传递提供程序。如果MQ异常结束,则“半持久”消息将丢失。

因此,它归结为实施细节。

希望这会有所帮助。

答案 1 :(得分:1)

使用Persistent消息,代理会将消息保存到磁盘,但取决于它具有哪种订阅者,如果没有持久订阅者,那么一些实现消息一旦被传递就被删除。

enter image description here