这是在创建持久订阅的上下文中。
DefaultMessageListenerContainer中有一个setClientId(),而SingleConnectionFactory中有另一个。
我的理解是:
因此,在ListenerContainer处设置setClientId()很有意义。
但是,为什么在连接工厂级别会有setClientId()?
即使SingleConnectionFactory只有一个连接,该连接也可以由多个使用者在多个 session 之间共享。正确的 ?
毋庸置疑,对于CachingConnectionFactory(从SingleConnectionFactory继承此方法)来说,这样做更加危险。
扩展版本:
我们可以说一个人不应该在Single/CachingConnectionFactory上使用setClientId()吗?
DefaultMessageListenerContainer的setClientId()中的以下语句使这一点变得更加必要:
因此,如果有人不小心在CachingConnectionFactory上设置了ClientID,则将来在DefaultMessageListenerContainer上设置的客户端ID将是no-ops!
最佳答案
连接工厂上的setClientId()
用于管理性设置客户端ID,以防止使用者应用程序手动设置客户端ID。实际上,根据JMS规范,如果在工厂已经设置了客户机ID的情况下由客户机设置了客户机ID,则将引发异常。
如果需要为不同的订阅者创建持久订阅,每个订阅者都有自己的客户端ID,请使用subscriber.setClientId()
,因为如果使用connectionFactory.setClientId()
并尝试从已设置了客户端ID的同一工厂创建多个连接,则该工厂将抛出异常,提示“连接clientId已连接。”
就个人而言,我喜欢在代码中具有灵活性和完整的控制权,因此我使用subscriber.setClientId()