Получить имя очереди RabbitMQ, из которой было получено сообщение

Используя SimpleMessageListenerContainer который подключен к нескольким очередям и настроен с ChannelAwareMessageListener, Можно ли определить, из какой очереди было отправлено сообщение? В частности, если сообщение было перенаправлено в очередь из Exchange.

Похоже, что если сообщение отправляется непосредственно в очередь, MessageProperties#getReceivedRoutingKey будет содержать имя очереди, но если сообщение направляется в очередь через Exchange, то эта информация содержит использованный ключ маршрутизации.

Я ищу механизм, который позволил бы правильно извлекать эту информацию независимо от того, как сообщение было доставлено в очередь. Или механизм для обогащения информации заголовком, содержащим эту информацию на стороне RabbitMQ.

1 ответ

У меня была похожая проблема, когда я хотел добавить имя очереди в контекст MDC slf4j.

Единственное решение, которое я нашел, это подкласс SimpleMessageListenerContainer и установите переменную ThreadLocal для имени очереди или в моем случае контекста MDC (который в основном является локальным потоком).

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

В моей компании собственная кодовая база у нас волшебная SimpleMessageListenerContainerFactory что делает создание кастома SimpleMessageListenerContainer на основе аннотаций маршрутизации (думаю, весна MVC @RequestMapping для amqp). Если есть интерес, возможно, мы сможем ускорить его открытие.

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