在使用基于standalone-full.xml配置的HornetQ配置JBOSS 7的JMS队列时,我注意到了一个名为“durable”的属性。
我查阅了几个来源,其中许多都说明队列始终是“持久”的,这意味着即使潜在的接收者在发送时处于非活动状态,消息也将始终被传递。
在JBoss 7 HornetQ中,此属性是否指临时队列?还是指某种非临时非持久队列?
在使用基于standalone-full.xml配置的HornetQ配置JBOSS 7的JMS队列时,我注意到了一个名为“durable”的属性。
我查阅了几个来源,其中许多都说明队列始终是“持久”的,这意味着即使潜在的接收者在发送时处于非活动状态,消息也将始终被传递。
在JBoss 7 HornetQ中,此属性是否指临时队列?还是指某种非临时非持久队列?
我认为“持久”的词更适用于主题(topic)而非队列(queues)。持久订阅是指当订阅者不在运行时,消息提供者会存储该订阅者的发布内容。一旦订阅者变成活跃状态,这些已存储的消息将发送给该订阅者。对于非持久订阅者,如果它们处于非活跃状态,则不会接收到任何发布内容。
关于队列,消息将保留在队列中,直到有人接收它们或它们过期。消息可以是持久的,这意味着它们将在消息提供者重新启动后仍然存在,也可以是非持久的,在消息提供者关闭时,消息将丢失。
经过简要调查,我得出了一些结论。所有观察都基于JBoss 7.1.1.Final和HornetQ Server 2.2.13.Final。
非持久队列不是临时队列。它会一直存在,直到手动删除。
提交给非持久队列的所有消息,在JMS提供者重新启动/失败后都会消失(忽略所提交消息的投递模式,即PERSISTENT / NON_PERSISTENT)。
消息中的JMSDeliveryMode头元素的值没有被修改。特别地,如果使用PERSISTENT传送模式将消息提交到非持久队列,则即使在非持久队列不保留消息的情况下(在JMS提供者重新启动/失败时会丢失),该标志也设置为PERSISTENT。
从客户端的角度看,这似乎有点令人不安,因为发送方可能无法确定消息的声明传输模式是否会得到尊重,由于'非持久'队列的问题含义。
此外,在这种情况下,术语“持久队列”似乎与“持久订阅”不协调,因为它似乎不以任何方式影响向非活动消费者传递消息。
JMS中的持久化订阅指的是,如果订阅者断开连接,然后重新连接到JMS目标(队列或主题),那么它将接收到目标中到目前为止尚未过期的所有已发送消息。