RabbitMqListener не слушает должным образом для тех же самых клавиш маршрутизации

У меня есть требование, где я должен слушать один и тот же обмен, одну и ту же очередь, но разные маршруты.

ниже приведен код для прослушивания сообщений от diff маршрутов

@Component
public class EmailMessageHandler {

@RabbitListener(bindings = @QueueBinding(
   value = @Queue(value = "queue", durable = "true"),
        exchange = @Exchange(value = "exchange", durable = "true" ,type = ExchangeTypes.DIRECT),
        key = "key1")
)
public void method1(String message) throws Exception {

    System.out.println("New message received" + message);
}

 @RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "queue", durable = "true"),
        exchange = @Exchange(value ="exchange", durable = "true",type = ExchangeTypes.DIRECT),
        key = "key2")
)
public void method(Message message) throws Exception {
    System.out.println("New message received" + message);
}
}

Проблема здесь заключается в том, что сообщения не всегда соответствуют правильному методу, например: сообщение key1 направляется к key2 и наоборот. Дайте мне знать, если кому-то понадобятся дополнительные детали. Заранее оцените вашу помощь

1 ответ

Решение

Я не думаю, что ваша цель возможна с RabbitMQ. Это идет вразрез с протоколом AMQP.

Я должен слушать один и тот же обмен, одну и ту же очередь, но разные маршруты.

Маршрут не является концепцией AMQP. AMQP имеет концепцию привязки- определение того, как сообщения перемещаются из обмена (где они публикуются) в очередь / очереди (откуда они потребляются).

Вы должны использовать разные очереди для разных маршрутов (потребителей). Каждый (уникальный) потребитель должен потреблять из другой очереди. Там не будет никаких шансов непоследовательной маршрутизации. Два потребителя из одной очереди должны использоваться только для балансировки нагрузки. Для маршрутизации вы можете использовать прямой обмен (самый простой, лучший для данного случая) или обмен заголовками.

См. https://www.rabbitmq.com/tutorials/amqp-concepts.html

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

Вы можете проверить это в RabbitMQ GUI. Вы увидите двух потребителей, подключенных к одной и той же очереди.

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