【问题标题】:Should we ever call setClientId() on the connection factory?我们应该在连接工厂上调用 setClientId() 吗?
【发布时间】:2013-05-04 11:06:15
【问题描述】:

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

我的理解是:

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

所以,在 ListenerContainer 中设置ClientId() 是有意义的。

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

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

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

此外,客户 ID 只能在原 ConnectionFactory 尚未分配一个

因此,如果有人不小心在 CachingConnectionFactory 上设置了ClientId,那么 DefaultMessageListenerContainer 上的客户端 ID 的未来集合将是无操作的!

【问题讨论】:

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


    【解决方案1】:

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

    连接工厂上的setClientId() 用于管理设置客户端ID,以防止消费者应用程序手动设置它;实际上,根据JMS规范,如果client id在工厂已经设置的情况下由客户端设置,则会引发异常。

    我们可以说一个人不应该使用 setClientId() Single/CachingConnectionFactory?

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-20
      • 1970-01-01
      • 2016-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多