ActiveMQ Artemis 2.10.1 + JMS 2.0 - общая подписка не работает
Программного обеспечения:
- Apache Artemis 2.10.1
- TomEE Plus 8.0
Я создал тему с 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 ответ
Ваша конфигурация неверна в нескольких местах.
Во-первых, тема JMS реализуется address
который поддерживает multicast
, больше ничего. Это отмечено в документации ActiveMQ Artemis. Следовательно, вашbroker.xml
должно быть это:
<address name = "ATOPIC">
<multicast/>
</address>
Во-вторых, ваши МБР должны подписываться на 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
.