持久订阅能否在客户端重启后生存?

时间:2010-07-20 18:27:43

标签: java jms message-queue messaging

如果我使用持久订阅,我可以重启我的客户端并重新订阅而不会丢失任何消息吗? (假设,我的客户没有以任何方式取消订阅。让我们说它只是崩溃了。)

让我澄清一下。 JMS 1.1规范说明如下:

  

9.3.3.2使用持久订阅重新连接主题

/* Reconnect to a durable subscription */
session.createDurableSubscriber(newsFeedTopic, "mySubscription");

但是,有一些重要的限制要注意:

  • 客户端必须连接到同一个Connection。
  • 目的地和订阅名称必须相同。
  • 如果指定了消息选择器,则它也必须相同。

“同一连接”部分让我感兴趣。目前尚不清楚在这种情况下“相同”意味着什么。

2 个答案:

答案 0 :(得分:2)

如果没有活跃的订阅者进行持久订阅,JMS会保留订阅的消息,直到订阅者收到消息,或者直到它们过期,或者直到删除持久订阅。这使订阅者应用程序能够在一段时间内与JMS提供程序断开连接,然后重新连接到提供程序并处理在缺席期间发布的消息。

答案 1 :(得分:2)

在规范中,看一下4.3,它提到Connection对象可以包含唯一的客户端标识符,4.3.2表示...

  

客户端标识符的目的是关联连接及其对象   由提供者代表客户维护的状态。根据定义,   由客户端标识符标识的客户端状态可以仅由一个客户端“使用”   一时间JMS提供程序必须防止并发执行客户端使用   它

因此,这里的意图是持久订阅包含唯一标识符,以便当应用程序重新订阅时,它可以附加到正确的状态存储,其中消息在其缺席时排队。由于首选方法是在特定于客户端的连接对象中对标识符进行编码,因此规范会指示您使用相同的连接重新连接,但在这种情况下,这意味着相同的 管理对象不是相同的连接句柄(使用WMQ术语)。

当然,您不需要管理对象,应用程序可以动态生成连接。在这种情况下,您需要安排它为连续的嫌疑人使用相同的客户端标识符。