检索消息来自的RabbitMQ队列的名称

时间:2014-03-26 08:54:19

标签: rabbitmq spring-amqp spring-rabbit

使用附加到多个队列并使用SimpleMessageListenerContainer配置的ChannelAwareMessageListener。是否可以确定消息已从哪个队列中消耗?特别是如果邮件从Exchange路由到队列。

如果消息直接发送到队列,MessageProperties#getReceivedRoutingKey将包含队列名称,但如果消息通过Exchange路由到队列,则此信息包含所使用的路由密钥。

我正在寻找一种机制,无论邮件如何传递到队列,都可以正确提取此信息。或者是一种机制,用于在RabbitMQ端使用包含此信息的标头来丰富信息。

1 个答案:

答案 0 :(得分:2)

我有一个类似的问题,我想将队列名称添加到slf4j MDC上下文。

我找到的唯一解决方案是子类SimpleMessageListenerContainer并为队列名称设置ThreadLocal变量,或者在我的情况下为MDC上下文(基本上是threadlocals)设置。

因为SimpleMessageListenerContainer仍然不确切知道哪个队列(您可以将多个队列绑定到容器),所以每个容器只允许一个队列,在我看来,无论如何都应该这样做。

在我公司自己的代码库中,我们有一个神奇的SimpleMessageListenerContainerFactory基于路由注释创建自定义SimpleMessageListenerContainer(想想amqp的spring mvc @RequestMapping)。如果有兴趣,也许我们可以加快开源。