使用附加到多个队列并使用SimpleMessageListenerContainer
配置的ChannelAwareMessageListener
。是否可以确定消息已从哪个队列中消耗?特别是如果邮件从Exchange路由到队列。
如果消息直接发送到队列,MessageProperties#getReceivedRoutingKey
将包含队列名称,但如果消息通过Exchange路由到队列,则此信息包含所使用的路由密钥。
我正在寻找一种机制,无论邮件如何传递到队列,都可以正确提取此信息。或者是一种机制,用于在RabbitMQ端使用包含此信息的标头来丰富信息。
答案 0 :(得分:2)
我有一个类似的问题,我想将队列名称添加到slf4j MDC上下文。
我找到的唯一解决方案是子类SimpleMessageListenerContainer
并为队列名称设置ThreadLocal变量,或者在我的情况下为MDC上下文(基本上是threadlocals)设置。
因为SimpleMessageListenerContainer
仍然不确切知道哪个队列(您可以将多个队列绑定到容器),所以每个容器只允许一个队列,在我看来,无论如何都应该这样做。
在我公司自己的代码库中,我们有一个神奇的SimpleMessageListenerContainerFactory
基于路由注释创建自定义SimpleMessageListenerContainer
(想想amqp的spring mvc @RequestMapping
)。如果有兴趣,也许我们可以加快开源。