inq*_*One 5 java spring jms spring-jms jakarta-ee
这是在创建持久订阅的背景下。DefaultMessageListenerContainer
中有一个 setClientId() , SingleConnectionFactory 中有另一个setClientId() 。
我的理解是:
因此,在 ListenerContainer 处 setClientId() 是有意义的。
但是,为什么在连接工厂级别会有 setClientId() ?
即使 SingleConnectionFactory 只有一个连接,该连接也可以由多个使用者跨多个会话共享。正确的 ?不用说,这对于 CachingConnectionFactory(从 SingleConnectionFactory 继承此方法)来说更危险。
扩展版本: 我们可以说不应该在 Single/CachingConnectionFactory 上使用 setClientId() 吗?DefaultMessageListenerContainer 的 setClientId() 中的以下语句使这一点变得更加必要:
此外,只有在原始 ConnectionFactory 尚未分配客户端 ID 的情况下,才能分配客户端 ID
因此,如果有人不小心在 CachingConnectionFactory 上设置了 ClientId,则将来在 DefaultMessageListenerContainer 上设置的客户端 id 将无法执行!
但是,为什么在连接工厂级别会有 setClientId() ?
setClientId()在连接工厂上用于管理性地设置客户端 ID,以防止消费者应用程序手动设置它;事实上,根据 JMS 规范,如果客户端 id 已由工厂设置,则由客户端设置,则会引发异常。
我们是否可以说不应在 Single/CachingConnectionFactory 上使用 setClientId() ?
如果您需要为不同的订阅者创建持久订阅,每个订阅者都有自己的客户端 ID,请使用subscriber.setClientId(),因为如果您使用connectionFactory.setClientId()并尝试从已设置客户端 ID 的同一工厂创建多个连接,工厂将抛出异常,抱怨“连接clientId已连接。”
就我个人而言,我喜欢在代码中具有灵活性和完全控制,所以我使用subscriber.setClientId()
| 归档时间: |
|
| 查看次数: |
6754 次 |
| 最近记录: |