Только один из двух моих получателей получает сообщение из очереди многоадресной рассылки ActiveMQ Artemis

У меня есть два приложения 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

Не могли бы вы подсказать, что я упускаю или делаю неправильно? Заранее спасибо.

Почему вы используете полное имя очереди?

Justin Bertram 23.04.2024 21:05
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

То, что вы наблюдаете, — это ожидаемое поведение, поскольку оба экземпляра JmsListener настроены на использование из одной очереди (т. е. onboard_address::onboard_application — полное имя очереди ). Все потребители в определенной очереди совместно используют сообщения в этой очереди.

Если вам нужна обычная семантика многоадресной рассылки (т. е. pub/sub), вам следует просто указать имя адреса, например:

@JmsListener(destination = "onboard_address")

Используйте то же значение для приложения, которое отправляет сообщения.

Подробнее о модели адресов ActiveMQ Artemis можно прочитать в документации.

Спасибо Джастину за помощь. Это сработало. У меня было неправильное понимание Multicast. Я обнаружил, что разные приложения прослушивают разные очереди многоадресной рассылки по одному и тому же адресу, и сообщение должно быть отправлено на этот адрес. Еще раз спасибо.

Ritabrata 24.04.2024 10:39

Другие вопросы по теме