gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-11-01 03:40:17 25 4
gpt4 key购买 nike

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

我的理解是:

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

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

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

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

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

Furthermore, a client ID can only be assigned if the original ConnectionFactory hasn't already assigned one

因此,如果有人不小心在 CachingConnectionFactory 上设置了 ClientId,则以后在 DefaultMessageListenerContainer 上设置客户端 ID 将是空操作!

最佳答案

But, Why would there be a setClientId() at the connection factory level ?

连接工厂上的

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

Can we say one should NOT use the setClientId() on a Single/CachingConnectionFactory?

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

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

关于java - 我们应该在连接工厂上调用 setClientId() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16470817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com