Долгосрочные подписки Artemis для многоадресной рассылки с JMS - PullRequest
0 голосов
/ 20 апреля 2020

С помощью JMS я хочу создать несколько долговременных подписок для topi c (адрес многоадресной рассылки). В случае одной двойной подписки это работает, а в случае нескольких - нет, и возникают ошибки.

Это мои слушатели: может быть, свойства заполнены неправильно?

 @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) {

}

Это фабрика listener: я не уверен насчет последнего свойства.

    @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

1 Ответ

1 голос
/ 20 апреля 2020

Как указано в спецификации JMS, только один клиент с одинаковым идентификатором может подключиться. Вы, очевидно, используете один и тот же идентификатор клиента для всех ваших соединений, а именно:

factory.setClientId("brokerClientId");

Попробуйте не установить идентификатор клиента и посмотрите, как это происходит.

Также убедитесь, что вы используете реализацию клиента JMS, которая фактически поддерживает JMS 2.0 (например, основной клиент JMS ActiveMQ Artemis).

...