在JBoss 7和HornetQ中,JMS队列的'durable'属性是什么意思?

15

在使用基于standalone-full.xml配置的HornetQ配置JBOSS 7的JMS队列时,我注意到了一个名为“durable”的属性。

enter image description here

我查阅了几个来源,其中许多都说明队列始终是“持久”的,这意味着即使潜在的接收者在发送时处于非活动状态,消息也将始终被传递。

在JBoss 7 HornetQ中,此属性是否指临时队列?还是指某种非临时非持久队列?

3个回答

16

我认为“持久”的词更适用于主题(topic)而非队列(queues)。持久订阅是指当订阅者不在运行时,消息提供者会存储该订阅者的发布内容。一旦订阅者变成活跃状态,这些已存储的消息将发送给该订阅者。对于非持久订阅者,如果它们处于非活跃状态,则不会接收到任何发布内容。

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


感谢提供的信息,正如大多数来源所建议的那样,队列默认情况下是“持久”的。这就是为什么我想知道在JBoss 7上使用HornetQ时非持久队列的含义。我尝试了一些示例,并将我的观察结果发布为答案。 - acalypso
1
@Shashi 为什么说持久性更适用于主题而不是队列?有何原因或解释? - Geek

13

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

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

  • 提交给非持久队列的所有消息,在JMS提供者重新启动/失败后都会消失(忽略所提交消息的投递模式,即PERSISTENT / NON_PERSISTENT)。

  • 消息中的JMSDeliveryMode头元素的值没有被修改。特别地,如果使用PERSISTENT传送模式将消息提交到非持久队列,则即使在非持久队列不保留消息的情况下(在JMS提供者重新启动/失败时会丢失),该标志也设置为PERSISTENT。

从客户端的角度看,这似乎有点令人不安,因为发送方可能无法确定消息的声明传输模式是否会得到尊重,由于'非持久'队列的问题含义。

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


9

JMS中的持久化订阅指的是,如果订阅者断开连接,然后重新连接到JMS目标(队列或主题),那么它将接收到目标中到目前为止尚未过期的所有已发送消息。


3
请注意,JBoss 上的属性似乎是指队列,而不是订阅者/订阅。 - acalypso

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接