15

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

在此处输入图像描述

我浏览了几个来源,其中许多都表示队列始终是“持久的”,这意味着消息将始终被传递,即使在发送时潜在接收者处于非活动状态的情况下也是如此。

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

4

3 回答 3

15

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

关于队列,消息被保留在队列中,直到有人收到它们或它们过期。消息可以是持久的,这意味着它们将在消息提供程序重新启动后仍然存在,并且在消息提供程序关闭时消息丢失的情况下是非持久的。

于 2012-12-11T09:14:26.640 回答
13

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

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

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

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

从客户端来看,这似乎有点令人不安,因为由于“非持久”队列的问题含义,发送者可能无法知道消息的声明传递模式是否会受到尊重。

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

于 2012-12-12T10:18:02.770 回答
9

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

于 2012-12-11T09:07:36.557 回答