使用HornetQ在JBoss 7中使用JMS队列的’持久’属性是什么意思?

在使用HornetQ在JBoss 7上配置JMS队列期间(基于standalone-full.xml配置),我注意到一个属性’持久’。

在此处输入图像描述

我浏览了几个来源,其中许多人表示队列总是“持久”,这意味着即使在发送时潜在的接收器处于非活动状态,也会始终传递消息。

JBoss 7 HornetQ中的这个属性是指临时队列吗? 或者此属性是否指某种非临时非持久队列?

我觉得“耐用”这个词更适用于主题而不是队列。 持久订阅是订阅者的发布在订阅者未运行时由消息传递提供者存储的订阅。 一旦订户变为活动状态,这些存储的消息将被传递给该订户。 对于非持久性订阅者,如果他们不活跃,将不会收到任何出版物。

对于队列,消息被保存在队列中,直到有人收到它们或它们到期为止。 消息可以是持久性的,这意味着它们将在消息传递提供程序关闭时重新启动消息传递提供程序和非持久性消息。

经过简短的调查,我得出了一些结论。 所有观察都基于JBoss 7.1.1.Final与HornetQ Server 2.2.13.Final。

  • 非持久队列不是临时队列。 它一直存在,直到手动删除。

  • 提交到非持久队列的所有消息在JMS提供程序重新启动/失败时消失(传递模式,即忽略提交的消息的PERSISTENT / NON_PERSISTENT)。

  • 不修改消息的JMSDeliveryMode头元素的值。 特别是,如果使用PERSISTENT传递模式将消息提交到非持久队列,则该标志将设置为PERSISTENT,即使非持久队列不会保留消息(如果JMS提供程序重新启动/失败,它将丢失) )。

从客户端来看,这似乎是一个令人不安的前景,因为发送者可能无法知道消息的声明传递模式是否会被尊重,因为“非持久”队列存在问题。

此外,在这种情况下,术语“持久队列”似乎与“持久订阅”脱节,因为它似乎不会以任何方式影响向不活跃的消费者传递消息。

JMS中的持久订阅意味着如果订户断开连接然后再次连接到JMS目标(队列或主题),它将接收到目前为止已发送到目的地但尚未过期的所有消息。