RabbitMQ暂停队列消耗

时间:2013-03-08 17:38:12

标签: java rabbitmq amqp spring-amqp

保持持久队列及其绑定但暂停其使用者的最佳方法是什么?

用例是:我想“让它崩溃”并停止处理消息,如果我们不断收到一堆我们无法处理的消息(例如数据库已关闭或架构问题)但想保留聚合到队列。这是允许发布但暂停消费。

我可以想到三个解决方案:

  1. 我可以让所有绑定到队列的消费者不断拒绝消息并重新排队,但这是一种浪费资源,更不用说我已经以编程方式执行上述逻辑。
  2. 我可以给所有消费者打电话basic.cancelConsumer(见下文)
  3. 或者就而言,我想我可以在绑定到队列的所有SimpleMessageListenerContainers上调用shutdown
  4. #1我们已经在做消息被拒绝了。问题是这最终会像一个无限的失败循环,如果您的日志记录失败甚至更多的资源被浪费。

    #3似乎很理想,但我必须知道所有消息监听器,然后通知他们关闭。我想我可以使用扇出交换来通知队列需要暂停。我觉得RabbitMQ必须内置这个逻辑。另一个问题是您可以将多个队列绑定到消息容器(并非所有队列都可能需要挂起)。

    对于#2我知道我可以cancel the consumer使用consumerTag,但问题(假设这是正确的方法)我在哪里可以获得{{ 1}}到队列?

2 个答案:

答案 0 :(得分:1)

如果您需要停止消费者,那么只需拨打基本取消,就可以这样做了。

拥有持久队列是您在声明队列时解决的问题:durable=true auto_delete=false

发布持久消息时确定:delivery_mode=2.

每个消费者都拥有自己的消费者标签。每当您从队列中收到消息时,信封应该包含消费者标签,您应该使用该标签调用基本取消。

AFAIK,您不能在conn 1中拥有消费者A,并在不同的连接上为该消费者调用基本取消。我可能错了。

答案 1 :(得分:1)

此解决方案具体为。它的答案基本上是#3

我维护的服务具有Map<String,CustomSimpleMessageListenerContainer>队列名称,以自定义扩展SimpleMessageListenerContainer

在发出一定数量的异常后,我发送一条“恐慌”消息,该消息进入服务收到的特殊队列以关闭消费者。