在使用HornetQ在JBoss 7上配置JMS队列期间(基于standalone-full.xml配置),我注意到一个属性'持久'。
我浏览了几个来源,其中许多人表示队列总是“持久”,这意味着即使在发送时潜在的接收者处于非活动状态,也会始终传递消息。
JBoss 7 HornetQ中的这个属性是指临时队列吗?或者这个属性是指某种非临时非持久队列?
答案 0 :(得分:16)
我觉得“耐用”这个词更适用于主题而不是队列。持久订阅是订阅者的发布在订阅者未运行时由消息传递提供者存储的订阅。一旦订户变为活动状态,这些存储的消息将被传递给该订户。对于非持久性订阅者,如果他们不活跃,将不会收到任何出版物。
对于队列,消息被保存在队列中,直到有人收到它们或它们到期为止。消息可以是持久性的,这意味着它们将在消息传递提供程序关闭时重新启动消息传递提供程序和非持久性消息时丢失。
答案 1 :(得分:13)
经过简短的调查后,我得出了一些结论。所有观察都基于JBoss 7.1.1.Final与HornetQ Server 2.2.13.Final。
非持久队列不是临时队列。它一直存在,直到手动删除。
提交到非持久队列的所有消息在JMS提供程序重新启动/失败时消失(传递模式,即忽略提交消息的PERSISTENT / NON_PERSISTENT)。
不修改消息的JMSDeliveryMode标头元素的值。特别是,如果使用PERSISTENT传递模式将消息提交到非持久队列,则该标志将设置为PERSISTENT,即使非持久队列不会保留该消息(如果JMS提供程序重新启动/失败,它将丢失) )。
从客户端来看,这似乎是一个令人不安的前景,因为发件人可能无法知道所声明的消息传递模式是否会被尊重,因为“非持久性”的问题意义'队列。
此外,在此上下文中,术语“持久队列”似乎与“持久订阅”脱节,因为它似乎不会以任何方式影响向不活跃消费者传递消息。
答案 2 :(得分:10)
JMS中的持久订阅意味着如果订阅者断开连接然后再次连接到JMS目标(队列或主题),它将接收到目前为止已发送到目标但尚未过期的所有消息。