如果我使用持久订阅,我可以重启我的客户端并重新订阅而不会丢失任何消息吗? (假设,我的客户没有以任何方式取消订阅。让我们说它只是崩溃了。)
让我澄清一下。 JMS 1.1规范说明如下:
9.3.3.2使用持久订阅重新连接主题
/* Reconnect to a durable subscription */
session.createDurableSubscriber(newsFeedTopic, "mySubscription");
但是,有一些重要的限制要注意:
“同一连接”部分让我感兴趣。目前尚不清楚在这种情况下“相同”意味着什么。
答案 0 :(得分:2)
如果没有活跃的订阅者进行持久订阅,JMS会保留订阅的消息,直到订阅者收到消息,或者直到它们过期,或者直到删除持久订阅。这使订阅者应用程序能够在一段时间内与JMS提供程序断开连接,然后重新连接到提供程序并处理在缺席期间发布的消息。
答案 1 :(得分:2)
在规范中,看一下4.3,它提到Connection对象可以包含唯一的客户端标识符,4.3.2表示...
客户端标识符的目的是关联连接及其对象 由提供者代表客户维护的状态。根据定义, 由客户端标识符标识的客户端状态可以仅由一个客户端“使用” 一时间JMS提供程序必须防止并发执行客户端使用 它
因此,这里的意图是持久订阅包含唯一标识符,以便当应用程序重新订阅时,它可以附加到正确的状态存储,其中消息在其缺席时排队。由于首选方法是在特定于客户端的连接对象中对标识符进行编码,因此规范会指示您使用相同的连接重新连接,但在这种情况下,这意味着相同的 管理对象不是相同的连接句柄(使用WMQ术语)。
当然,您不需要管理对象,应用程序可以动态生成连接。在这种情况下,您需要安排它为连续的嫌疑人使用相同的客户端标识符。