在JMS 1.x中,创建持久订阅时,使用clientId唯一标识客户端。此answer解释了JMS 1.x
中clientId的用法。使用JMS 2.x时,clientId被设置为可选。我想了解在JMS 2.x中提供clientId的利弊。
来自Oracle article on JMS 2.x features:
共享的持久订阅。这些仅在JMS 2.0中可用,并且使用
createSharedDurableConsumer
创建。他们可以有任何数量的消费者。 设置客户端标识符是可选的。如果已设置订阅,则通过订阅名称和客户端标识符的组合来标识。
听起来订阅名称现在是唯一的标识符,但是为什么有clientID?这些是会话类的新方法,因此不能向后兼容。用JMS 2.x设置clientId有什么好处或弊端?
MessageConsumer messageConsumer = session.createSharedDurableConsumer(topic, "myDurableSub");
答案 0 :(得分:0)
JMS 2规范指出了为什么在6.1.3节中存在客户端ID:
JMS定义的客户机标识符的唯一用途是其在 识别未共享的持久订阅或其在中的可选用途 标识共享的持久或非持久订阅。
关于共享的非持久订阅,规范在第8.3.3节中对此进行了说明:
共享的非持久订阅由以下名称指定: 客户和客户标识符(如果已设置)。如果设置客户端标识符的时间 首先创建共享的非持久订阅,然后创建一个客户端 随后希望在共享的非持久对象上创建消费者 订阅必须使用相同的客户端标识符。
该规范在第8.3.4节中说明了有关共享持久订阅的基本知识:
共享的持久订阅由客户端指定的名称标识 以及客户标识符(如果已设置)。如果在设置客户端标识符时 首先创建共享持久订阅,然后创建一个客户端 随后希望在共享的持久性上创建消费者 订阅必须使用相同的客户端标识符。
通过使客户端标识符对于共享的持久和非持久订阅是可选的,这使得共享订阅更加方便,因为每个客户端只需要提供订阅名称,而不是客户端标识符和订阅名称。这符合JMS 2的通用主题,该主题简化了API,使JMS更加易于使用。