【发布时间】:2013-05-04 11:06:15
【问题描述】:
这是在创建持久订阅的上下文中。
DefaultMessageListenerContainer 中有一个 setClientId(),SingleConnectionFactory 中有另一个。
我的理解是:
- 持久订阅适用于消费者/订阅者。
- 不同的消费者应该能够使用不同的客户端 ID。
- 不同的消费者应该能够共享一个连接。
- 每个消费者有一对 (ListenerContainer,Listener)。
所以,在 ListenerContainer 中设置ClientId() 是有意义的。
但是,为什么连接工厂级别会有 setClientId() 呢?
即使 SingleConnectionFactory 只有一个连接,该连接也可以由多个使用者共享,跨越多个会话。正确的 ? 不用说,对于 CachingConnectionFactory(它从 SingleConnectionFactory 继承此方法)更危险。
扩展版: 我们可以说不应该在 Single/CachingConnectionFactory 上使用 setClientId() 吗? DefaultMessageListenerContainer 的 setClientId() 中的以下语句使这一点更加重要:
此外,客户 ID 只能在原 ConnectionFactory 尚未分配一个
因此,如果有人不小心在 CachingConnectionFactory 上设置了ClientId,那么 DefaultMessageListenerContainer 上的客户端 ID 的未来集合将是无操作的!
【问题讨论】:
标签: java spring jakarta-ee jms spring-jms