使用Springboot持久订阅Artemis Cluster

时间:2017-12-11 19:39:24

标签: jms spring-jms activemq-artemis

我创建了包含2个节点的Artemis Cluster并成功连接了我的Spring-boot应用程序(github link),实现基于clustered-static-discovery

现在我正在测试Durable订阅它有一些奇怪的行为 我正在制作5个消息,只消耗3个

   @Bean
    public MessageListenerContainer listenerContainer1(@Qualifier("connectionFactory") ConnectionFactory connectionFactory, Consumer consumer, SimpleMessageConverter messageConverter, @Qualifier("topic") Topic topic) {
        DefaultMessageListenerContainer defaultMessageListenerContainer =
                new DefaultMessageListenerContainer();


    @Bean("connectionFactory")
    public ConnectionFactory activeMQJMSConnectionFactory(@Qualifier("amqTransportConfiguration") TransportConfiguration transportConfiguration) throws JMSException {
        ActiveMQJMSConnectionFactory activeMQJMSConnectionFactory =
                new ActiveMQJMSConnectionFactory( false, transportConfiguration);
        activeMQJMSConnectionFactory.setPassword("admin");
        activeMQJMSConnectionFactory.setUser("admin");
        activeMQJMSConnectionFactory.setClientID("admin");
        return activeMQJMSConnectionFactory;
    }
defaultMessageListenerContainer.setConnectionFactory(connectionFactory);
    defaultMessageListenerContainer.setDestination(topic);
    defaultMessageListenerContainer.setMessageListener(consumer);
    defaultMessageListenerContainer.setSessionAcknowledgeMode(1);
    defaultMessageListenerContainer.setSubscriptionName("mySub");
    defaultMessageListenerContainer.setSubscriptionDurable(true);
    defaultMessageListenerContainer.setMessageConverter(messageConverter);
    return defaultMessageListenerContainer;
}

这里是整个config

我已经通过http://localhost:816i/hawtio/ wrb UI查看了artemis,发现生产者只获得了5个中的5个消息

(message-load-balancing - > STRICT)

我在这里做错了什么?

2 个答案:

答案 0 :(得分:3)

问题出在Artemis依赖项中,现有的使用依赖项在某种程度上无法处理与集群的PubSab连接,我没有找到丢失消息的任何错误日志。 我改变了依赖性

<dependency>
        <groupId>org.apache.activemq</groupId>
        <artifactId>artemis-jms-client-all</artifactId>
        <version>2.2.0</version>
    </dependency>

现在它正在运作。

答案 1 :(得分:0)

看起来问题与代码有关。两个不同的持久订阅共享相同的持久订阅名称。在为每个MessageListenerContainer实例使用唯一的订阅名称后,我能够通过测试:

//listener container (1)
defaultMessageListenerContainer.setDurableSubscriptionName("sub1");

/* --- */

//listener container (2)
defaultMessageListenerContainer.setDurableSubscriptionName("sub2");