在带有 HornetQ 的 JBoss 7 中,JMS Queue 的“持久”属性是什么意思?

2022-09-03 09:32:19

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

enter image description here

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

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


答案 1

我觉得“持久”这个词比队列更适用于主题。持久预订是指当消息传递服务器未运行时,消息传递提供程序存储订阅服务器的发布。订阅者变为活动状态后,这些存储的消息将传递到该订阅者。对于非持久订阅者,如果发布不处于活动状态,则不会收到任何发布。

对于队列,消息将保留在队列中,直到有人收到它们或它们过期。消息可以是持久的,这意味着它们将在消息传递提供程序重新启动后继续存在,并且在消息传递提供程序出现故障时消息丢失的非持久性消息。


答案 2

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

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

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

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

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

此外,在此上下文中,术语“持久队列”似乎与“持久订阅”脱节,因为它似乎不会以任何方式影响向非活动使用者传递消息。


推荐