ActiveMQ Artemis 2.10.1 + JMS 2.0 - общая подписка не работает - PullRequest
1 голос
/ 24 марта 2020

Программное обеспечение:

  • Apache Artemis 2.10.1
  • TomEE plus 8.0

Я создал топи c с 2 потребителями , Каждый потребитель имеет 1 MDB каждый. У меня есть один основной метод, где я делаю настройку и все.

Несмотря на то, что я отправляю только одно сообщение и указал, что это общая подписка, сообщение используется обоими MDB. Не уверен, как решить эту проблему. Конечно, нет ошибки. Но это не ожидаемая функциональность из моего кода.

@MessageDriven(name = "TOPICMDB1", activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "BTOPIC"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "mytopic"),
    @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "durable"),
    @ActivationConfigProperty(propertyName = "shareSubscriptions", propertyValue="true"),
    @ActivationConfigProperty(propertyName = "clientId", propertyValue = "MyClientId_1")
})
@MessageDriven(name = "TOPICMDB2", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "CTOPIC"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), 
    @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "mytopic"),
    @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "durable"),
    @ActivationConfigProperty(propertyName = "shareSubscriptions", propertyValue="true"),
    @ActivationConfigProperty(propertyName = "clientId", propertyValue = "MyClientId_2")
})      
connectionFactory = new ActiveMQConnectionFactory(input.getUrl());
connection = (ActiveMQConnection) connectionFactory.createConnection(input.getUsername(), input.getPassword());
session = connection.createTopicSession(input.isTransacted(), Session.AUTO_ACKNOWLEDGE);
connection.start();
session = connection.createTopicSession(true, Session.SESSION_TRANSACTED);  
destination = session.createTopic("ATOPIC");
consumer = session.createSharedDurableConsumer( (Topic) destination, "mytopic");
rtn = consumer.receive();
session.commit(); 

Я не уверен, почему я создаю этого общего долговременного потребителя на mytopic (имя подписки). Я пытался различными способами выполнить мою задачу.

tomee.xml:

<Resource id="ATOPIC"
          class-name="org.apache.activemq.artemis.api.jms.ActiveMQJMSClient"
          constructor="name"
          factory-name="createTopic"
          type="javax.jms.Topic">
   name=ATOPIC
</Resource>

broker.xml:

<address name = "ATOPIC">
   <multicast>
      <queue name = "BTOPIC"/>
      <queue name = "CTOPIC"/>
   </multicast>
</address>

1 Ответ

0 голосов
/ 24 марта 2020

Ваша конфигурация неверна в нескольких местах.

Во-первых, JMS topi c реализован address, который поддерживает multicast, и больше ничего. Это отмечено в документации ActiveMQ Artemis . Следовательно, ваш broker.xml должен иметь следующее значение:

<address name = "ATOPIC">
   <multicast/>
</address>

Во-вторых, ваши MDB должны подписываться на ATOPIC с тем же именем подписки и без clientId, например:

@MessageDriven(name = "TOPICMDB1", activationConfig = { 
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "ATOPIC"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"),
    @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "mytopicSubscription"),
    @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
    @ActivationConfigProperty(propertyName = "shareSubscriptions", propertyValue="true")
})
@MessageDriven(name = "TOPICMDB2", activationConfig = {
    @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Topic"),
    @ActivationConfigProperty(propertyName = "destination", propertyValue = "ATOPIC"),
    @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Auto-acknowledge"), 
    @ActivationConfigProperty(propertyName = "subscriptionName", propertyValue = "mytopicSubscription"),
    @ActivationConfigProperty(propertyName = "subscriptionDurability", propertyValue = "Durable"),
    @ActivationConfigProperty(propertyName = "shareSubscriptions", propertyValue="true")
})      

В-третьих, вам не нужно вручную создавать общего долговременного потребителя в ATOPIC.

...