这是在创建持久订阅的上下文中。DefaultMessageListenerContainer
中有一个 setClientId() , SingleConnectionFactory 中有另一个。
我的理解是:
- 持久订阅适用于消费者/订阅者。
- 不同的消费者应该能够使用不同的客户端 ID。
- 不同的消费者应该能够共享一个连接。
- 每个消费者有一个 (ListenerContainer,Listener) 对。
因此,在 ListenerContainer 中设置客户端Id() 是有意义的。
但是,为什么在连接工厂级别会有一个 setClientId() 呢?
即使 SingleConnectionFactory 只有一个连接,该连接也可以由多个使用者跨多个会话共享。正确的 ?不用说,对于 CachingConnectionFactory(它从 SingleConnectionFactory 继承此方法)更危险。
扩展版本: 我们可以说不应该在 Single/CachingConnectionFactory 上使用 setClientId() 吗?DefaultMessageListenerContainer 的 setClientId() 中的以下语句使这一点更加迫切:
此外,只有在原始 ConnectionFactory 尚未分配客户端 ID 时,才能分配客户端 ID
因此,如果有人不小心在 CachingConnectionFactory 上设置了客户端 ID,那么 DefaultMessageListenerContainer 上的客户端 ID 的未来集合将是无操作的!