У меня есть два приложения Spring Boot, использующие JmsListener
, потребляющие из очереди многоадресной рассылки ActiveMQ Artemis с именем onboard_application
и адресом с именем onboard_address
, но только одному удается получить сообщение, а затем сообщение удаляется из очереди.
Мои слушатели выглядят, как показано ниже:
@JmsListener(destination = "onboard_address::onboard_application")
public void applicationOnboardingMessageReceiver(String message) throws JsonProcessingException {
ApplicationDTO appDTO = objectMapper.readValue(message, ApplicationDTO.class);
//Business logic
}
Отправитель моего сообщения выглядит так:
public void sendMulticastMessage(String channel, Object payload) throws Exception {
try {
jmsTemplate.setPubSubDomain(true);
jmsTemplate.convertAndSend(channel, objectMapper.writeValueAsString(payload));
} catch (JsonProcessingException e) {
//Take action
}
}
Конфигурация в application.yml
:
spring:
artemis:
mode: native
user: artemis
password: artemis
broker-url: tcp://localhost:61616
jms:
pub-sub-domain: true
Не могли бы вы подсказать, что я упускаю или делаю неправильно? Заранее спасибо.
То, что вы наблюдаете, — это ожидаемое поведение, поскольку оба экземпляра JmsListener
настроены на использование из одной очереди (т. е. onboard_address::onboard_application
— полное имя очереди ). Все потребители в определенной очереди совместно используют сообщения в этой очереди.
Если вам нужна обычная семантика многоадресной рассылки (т. е. pub/sub), вам следует просто указать имя адреса, например:
@JmsListener(destination = "onboard_address")
Используйте то же значение для приложения, которое отправляет сообщения.
Подробнее о модели адресов ActiveMQ Artemis можно прочитать в документации.
Спасибо Джастину за помощь. Это сработало. У меня было неправильное понимание Multicast. Я обнаружил, что разные приложения прослушивают разные очереди многоадресной рассылки по одному и тому же адресу, и сообщение должно быть отправлено на этот адрес. Еще раз спасибо.
Почему вы используете полное имя очереди?