这是在创建持久订阅的上下文中。
DefaultMessageListenerContainer中有一个setClientId(),SingleConnectionFactory中有另一个。
我的理解是:
因此,在ListenerContainer中设置setClientId()是有意义的。
但是,为什么连接工厂级别会有setClientId()?
即使SingleConnectionFactory只有一个连接,多个会话也可以由多个使用者共享该连接。对 ? 不用说,对于CachingConnectionFactory(从SingleConnectionFactory继承此方法)更危险。
扩展版 我们可以说不应该在Single / CachingConnectionFactory上使用setClientId()吗? DefaultMessageListenerContainer的setClientId()中的以下语句使这更加迫切:
此外,只有原始客户端ID才能分配 ConnectionFactory尚未分配一个
因此,如果有人在CachingConnectionFactory上意外地设置了ClientId,那么DefaultMessageListenerContainer上未来的客户端ID集将是no-ops!
答案 0 :(得分:1)
连接工厂上的但是,为什么在连接工厂级别会有一个setClientId()?
setClientId()
用于管理设置客户端ID,以防止消费者应用程序手动设置它;实际上,根据JMS规范,如果客户端ID是由工厂设置的客户端ID设置的,则会抛出异常。
我们可以说不应该在a上使用setClientId() 单/ CachingConnectionFactory?
如果您需要为不同的订阅者创建持久订阅,每个订阅者都有自己的客户端ID,请使用subscriber.setClientId()
,因为如果您使用connectionFactory.setClientId()
并尝试使用客户端ID从同一工厂创建多个连接已设置,工厂将抛出一个异常,抱怨“连接 clientId 已经连接。”
就个人而言,我喜欢在代码中具有灵活性和完全控制权,因此我使用subscriber.setClientId()