RabbitMQ暂停队列消耗

Ada*_*ent 8 java amqp rabbitmq spring-amqp

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

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

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

  1. 我可以让所有绑定到队列的消费者不断拒绝消息并重新排队,但这是一种浪费资源,更不用说我已经以编程方式执行上述逻辑.
  2. 我可以打电话basic.cancelConsumer给所有消费者(见下文)
  3. 或者就而言,我想我可以调用绑定到队列的shutdown所有SimpleMessageListenerContainer.

#1我们已经在做消息被拒绝了.问题是这最终会像一个无限的故障循环,如果您的日志记录失败甚至更多的资源被浪费.

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

对于#2我知道我可以取消消费者与其consumerTag但问题(假设是上面做正确的方式)是我在哪里得到的名单consumerTags到一个队列?

old*_*und 3

如果您需要停止消费者,那么只需调用基本取消即可,这就是执行此操作的方法。

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

消息持久化是在您发布消息时确定的:delivery_mode=2.

每个消费者都有自己的消费者标签。每当您从队列中获取消息时,信封都应该具有消费者标签,并且您应该使用该标签调用基本取消。

AFAIK,你不能让消费者 A 在 conn 1 中,并在不同的连接上为该消费者调用基本取消。在这一点上我可能是错的。