Получить имя очереди RabbitMQ, из которой было получено сообщение
Используя SimpleMessageListenerContainer
который подключен к нескольким очередям и настроен с ChannelAwareMessageListener
, Можно ли определить, из какой очереди было отправлено сообщение? В частности, если сообщение было перенаправлено в очередь из Exchange.
Похоже, что если сообщение отправляется непосредственно в очередь, MessageProperties#getReceivedRoutingKey
будет содержать имя очереди, но если сообщение направляется в очередь через Exchange, то эта информация содержит использованный ключ маршрутизации.
Я ищу механизм, который позволил бы правильно извлекать эту информацию независимо от того, как сообщение было доставлено в очередь. Или механизм для обогащения информации заголовком, содержащим эту информацию на стороне RabbitMQ.
1 ответ
У меня была похожая проблема, когда я хотел добавить имя очереди в контекст MDC slf4j.
Единственное решение, которое я нашел, это подкласс SimpleMessageListenerContainer
и установите переменную ThreadLocal для имени очереди или в моем случае контекста MDC (который в основном является локальным потоком).
Так как SimpleMessageListenerContainer
до сих пор точно не известно, какую очередь (вы можете привязать несколько очередей к контейнеру), вам придется разрешить только одну очередь на контейнер, что, на мой взгляд, то, что вы должны делать независимо.
В моей компании собственная кодовая база у нас волшебная SimpleMessageListenerContainerFactory
что делает создание кастома SimpleMessageListenerContainer
на основе аннотаций маршрутизации (думаю, весна MVC @RequestMapping
для amqp). Если есть интерес, возможно, мы сможем ускорить его открытие.