【问题标题】:Artemis durable subscriptions for multicast address with JMSArtemis 使用 JMS 对多播地址进行持久订阅
【发布时间】:2020-08-02 20:22:18
【问题描述】:

使用 JMS,我想为一个主题(多播地址)创建一些持久订阅。在一个双订阅的情况下它可以工作,但在更多的情况下它不会并且会发生错误。

这些是我的听众:可能没有正确填写属性?

 @JmsListener(destination = "VirtualTopic.test", id = "c1", subscription = "Consumer.A.VirtualTopic.test", containerFactory = "queueConnectionFactory")
public void receive1(String m) {

}


@JmsListener(destination = "VirtualTopic.test", id = "c2", subscription = "Consumer.B.VirtualTopic.test", containerFactory = "queueConnectionFactory")    
public void receive2(String m) {

}

这是 listenerFactory:我不确定最后一个属性。

    @Bean
    public DefaultJmsListenerContainerFactory queueConnectionFactory() {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        factory.setConnectionFactory(connectionFactory());
        factory.setClientId("brokerClientId");
        factory.setSubscriptionDurable(true);
        factory.setSubscriptionShared(true);       **<-- needed for my case?**
        return factory;
    }

    @Bean
    public ActiveMQConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl);
        return connectionFactory;
    }

这些是错误日志,当我设置“factory.setSubscriptionShared(true);”时:

2020-04-17 11:23:44.485  WARN 7900 --- [enerContainer-3] o.s.j.l.DefaultMessageListenerContainer  : Setup of JMS message listener invoker failed for destination 'VirtualTopic.test' - trying to recover. Cause: org.apache.activemq.ActiveMQSession.createSharedDurableConsumer(Ljavax/jms/Topic;Ljava/lang/String;Ljava/lang/String;)Ljavax/jms/MessageConsumer; 
2020-04-17 11:23:44.514 ERROR 7900 --- [enerContainer-3] o.s.j.l.DefaultMessageListenerContainer  : Could not refresh JMS Connection for destination 'VirtualTopic.test' - retrying using FixedBackOff{interval=5000, currentAttempts=0, maxAttempts=unlimited}. Cause: Broker: d1 - Client: brokerClientId already connected from /127.0.0.1:59979

【问题讨论】:

    标签: java spring-boot spring-jms activemq-artemis


    【解决方案1】:

    正如 JMS 规范所指出的,只有一个具有相同 ID 的客户端可以连接。您显然对所有连接都使用相同的客户端 ID,即:

    factory.setClientId("brokerClientId");
    

    尝试设置客户端 ID,看看效果如何。

    此外,请确保您使用的是真正支持 JMS 2.0 的 JMS 客户端实现(例如 ActiveMQ Artemis 核心 JMS 客户端)。

    【讨论】:

    • 感谢您的回复。不幸的是,您需要该 clientId 来进行 durbale 订阅。否则你会得到错误:原因:如果没有在 Connection 上指定唯一的 clientID,就无法创建持久订阅者
    • 如 JMS 2 规范的第 6.1.2 节所述,客户端 ID 对于 非共享​​> 持久订阅是必需的,但对于共享订阅是可选持久订阅。听起来可能是 Spring JMS 使用了错误的 JMS API 调用来创建共享持久订阅。
    • 我从你那里找到了另一个答案,它回答了我的问题;)link。我使用的是 ActiveMq 5.x JMS 客户端,它不支持共享持久潜艇。这样做的原因是,我想使用通配符来解析 virtualTopics 命名约定。但这在 org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactoryjavax.jms.ConnectionFactory 中不受支持。那些连接工厂有什么区别?
    • 如何将内容发送到主题的专用队列或订阅?使用管理控制台可以,也可以接收。但是按 jms 发送并不能以某种方式发送。
    • 虚拟主题确实特定于 ActiveMQ 5.x。它们不是 JMS 规范的一部分。将您的应用程序与特定于代理的行为联系起来并不明智,这就是为什么首先存在标准和 API 之类的东西。我建议您为此创建一个全新的问题,因为它与 JMS 2 中的共享持久订阅完全不同。
    猜你喜欢
    • 2018-05-25
    • 2013-12-17
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-11-13
    • 2021-06-09
    • 2017-11-08
    • 2020-11-18
    相关资源
    最近更新 更多