我们应该在连接工厂上调用setClientId()吗?

时间:2013-05-09 20:46:45

标签: java spring java-ee jms spring-jms

这是在创建持久订阅的上下文中。
DefaultMessageListenerContainer中有一个setClientId(),SingleConnectionFactory中有另一个。

我的理解是:

  • 持久订阅适用于消费者/订阅者。
  • 不同的消费者应该能够使用不同的客户ID。
  • 不同的消费者应该能够共享连接。
  • 每个消费者都有一个(ListenerContainer,Listener)对。

因此,在ListenerContainer中设置setClientId()是有意义的。

但是,为什么连接工厂级别会有setClientId()?

即使SingleConnectionFactory只有一个连接,多个会话也可以由多个使用者共享该连接。对 ? 不用说,对于CachingConnectionFactory(从SingleConnectionFactory继承此方法)更危险。

扩展版 我们可以说不应该在Single / CachingConnectionFactory上使用setClientId()吗? DefaultMessageListenerContainer的setClientId()中的以下语句使这更加迫切:

  

此外,只有原始客户端ID才能分配   ConnectionFactory尚未分配一个

因此,如果有人在CachingConnectionFactory上意外地设置了ClientId,那么DefaultMessageListenerContainer上未来的客户端ID集将是no-ops!

1 个答案:

答案 0 :(得分:1)

  

但是,为什么在连接工厂级别会有一个setClientId()?

连接工厂上的

setClientId()用于管理设置客户端ID,以防止消费者应用程序手动设置它;实际上,根据JMS规范,如果客户端ID是由工厂设置的客户端ID设置的,则会抛出异常。

  

我们可以说不应该在a上使用setClientId()   单/ CachingConnectionFactory?

如果您需要为不同的订阅者创建持久订阅,每个订阅者都有自己的客户端ID,请使用subscriber.setClientId(),因为如果您使用connectionFactory.setClientId()并尝试使用客户端ID从同一工厂创建多个连接已设置,工厂将抛出一个异常,抱怨“连接 clientId 已经连接。”

就个人而言,我喜欢在代码中具有灵活性和完全控制权,因此我使用subscriber.setClientId()