Java 持久订阅能否在客户端重新启动后继续存在?

Java 持久订阅能否在客户端重新启动后继续存在?,java,jms,message-queue,messaging,Java,Jms,Message Queue,Messaging,如果我使用持久订阅,我可以重新启动客户端并重新订阅而不丢失任何消息吗?(假设我的客户没有以任何方式退订,就说它崩溃了) 让我澄清一下。JMS 1.1规范说明如下: 9.3.3.2使用持久订阅重新连接到主题 但是,有一些重要的限制需要注意: 客户端必须连接到同一个连接 目标和订阅名称必须相同 如果指定了消息选择器,则该选择器也必须相同 “同样的联系”部分让我感兴趣。在这种情况下,“相同”是什么意思尚不清楚 如果持久订阅没有活动订阅服务器,JMS将保留订阅的消息,直到订阅服务器收到消息、消息过期

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

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

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

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

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

“同样的联系”部分让我感兴趣。在这种情况下,“相同”是什么意思尚不清楚

如果持久订阅没有活动订阅服务器,JMS将保留订阅的消息,直到订阅服务器收到消息、消息过期或持久订阅被删除。这使订户应用程序能够在与JMS提供程序断开连接的情况下运行一段时间,然后重新连接到提供程序并处理在其不在时发布的消息。

在规范中,请看4.3,其中提到连接对象可以包含唯一的客户端标识符,而4.3.2则指出

客户端标识符的用途是将连接与其对象关联起来 由提供者代表客户维护的状态。顾名思义 由客户端标识符标识的客户端状态在同一时间只能由一个客户端“使用” 一段时间。JMS提供程序必须防止并发执行的客户端使用 它

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

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

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