1

使用SimpleMessageListenerContainer附加到多个队列并配置有ChannelAwareMessageListener. 是否可以确定从哪个队列消费了一条消息?特别是如果消息是从 Exchange 路由到队列的。

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

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

4

1 回答 1

3

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

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

因为SimpleMessageListenerContainer仍然不知道究竟是哪个队列(您可以将多个队列绑定到一个容器),所以您必须每个容器只允许一个队列,我认为无论如何您都应该这样做。

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

于 2014-06-11T17:29:15.723 回答