5

这是在创建持久订阅的上下文中。DefaultMessageListenerContainer
中有一个 setClientId() , SingleConnectionFactory 中有另一个。

我的理解是:

  • 持久订阅适用于消费者/订阅者。
  • 不同的消费者应该能够使用不同的客户端 ID。
  • 不同的消费者应该能够共享一个连接。
  • 每个消费者有一个 (ListenerContainer,Listener) 对。

因此,在 ListenerContainer 中设置客户端Id() 是有意义的。

但是,为什么在连接工厂级别会有一个 setClientId() 呢?

即使 SingleConnectionFactory 只有一个连接,该连接也可以由多个使用者跨多个会话共享。正确的 ?不用说,对于 CachingConnectionFactory(它从 SingleConnectionFactory 继承此方法)更危险。

扩展版本: 我们可以说不应该在 Single/CachingConnectionFactory 上使用 setClientId() 吗?DefaultMessageListenerContainer 的 setClientId() 中的以下语句使这一点更加迫切:

此外,只有在原始 ConnectionFactory 尚未分配客户端 ID 时,才能分配客户端 ID

因此,如果有人不小心在 CachingConnectionFactory 上设置了客户端 ID,那么 DefaultMessageListenerContainer 上的客户端 ID 的未来集合将是无操作的!

4

1 回答 1

4

但是,为什么在连接工厂级别会有一个 setClientId() 呢?

setClientId()on 连接工厂用于管理设置客户端 ID,以防止消费者应用程序手动设置它;事实上,根据 JMS 规范,如果客户端 id 在工厂已经设置时由客户端设置,则会引发异常。

我们可以说不应该在 Single/CachingConnectionFactory 上使用 setClientId() 吗?

如果您需要为不同的订阅者创建持久订阅,每个订阅者都有自己的客户端 ID,subscriber.setClientId()请使用clientId已经连接。”connectionFactory.setClientId()

就个人而言,我喜欢在我的代码中拥有灵活性和完全控制权,所以我使用subscriber.setClientId()

于 2013-06-17T21:04:41.267 回答