【问题标题】:Use same JMS ClientID for multiple destinations/topics对多个目的地/主题使用相同的 JMS ClientID
【发布时间】:2021-09-16 00:56:25
【问题描述】:

我正在开发一个订阅 JBoss 4 上的两个主题并处理传入消息的新应用程序。实际上,我使用两个具有持久订阅的DefaultMessageListenerContainer 进行连接。

当我对持久订阅使用相同的 ClientID 时,容器失败并出现错误:

2021-07-02T10:28:05.487+0200 [DefaultMessageListenerContainer-1] ERROR org.springframework.jms.listener.DefaultMessageListenerContainer - Could not refresh JMS Connection for destination 'TOPIC.providerDurableTopic' - retrying using FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. Cause: This client id 'ka03.9971.mueller.de' is already registered!

是否有任何可能性两个使用相同的 clientId 用于两个不同的目的地。是否还有其他ListenerContainer 可以使用一个容器实例处理多个目的地?

我们尝试使用相同的 clientId 的原因是因为我们尝试用它的订阅替换旧的应用程序。这个旧应用程序连接到一个 JMS 事务中的主题,并且能够使用相同的客户端 ID。

【问题讨论】:

    标签: jms spring-jms durable-subscription


    【解决方案1】:

    JMS 1.1 规范明确禁止具有相同客户端 ID 的多个连接。对于您的问题,我看到了三种可能的解决方案:

    • 每个消息侦听器都可以使用具有唯一客户端 ID 的连接。
    • 两个消息侦听器可以使用相同的连接。
    • 升级到 JMS 2 代理(例如ActiveMQ Artemis)。 JMS 2 放宽了对持久订阅的要求,不再严格要求客户 ID。

    【讨论】:

      【解决方案2】:

      我想一种可能的解决方案是使用 SingleConnectionFactory 并在其上设置 clientId。所以只有一个连接将用于两个主题

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-11-13
        • 2019-08-22
        • 1970-01-01
        • 2021-02-06
        • 1970-01-01
        • 2017-01-14
        • 2018-06-08
        • 2011-07-10
        相关资源
        最近更新 更多