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

我的理解是:

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

  • 因此,在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()

    10-04 17:30