保持持久队列及其绑定但暂停其消费者的最佳方法是什么?
用例是:如果我们不断收到一堆我们无法处理的消息(例如数据库已关闭或架构问题),但希望继续聚合到队列。即允许发布但暂停消费。
我可以想到三个解决方案:
- 我可以让绑定到队列的所有消费者不断拒绝消息并重新排队,但这有点浪费资源,更不用说我已经以编程方式执行了上述逻辑。
- 我可以呼吁
basic.cancelConsumer
所有消费者(见下文) - 或者就spring-amqp而言,我想我可以调用
shutdown
所有绑定到队列的SimpleMessageListenerContainers 。
#1
我们已经在做,因为消息被拒绝了。问题是这最终就像一个无限的while循环失败,如果你记录这个失败,就会浪费更多的资源。
#3
似乎很理想,但我必须了解所有消息侦听器,然后通知它们关闭。我想我可以使用扇出交换来通知队列需要暂停。我觉得 RabbitMQ 必须为这个逻辑内置一些东西。另一个问题是您可以将多个队列绑定到一个消息容器(并非所有队列都可能需要暂停)。
因为#2
我知道我可以用它来取消消费者consumerTag
,但问题(假设这是执行上述操作的正确方法)是我从哪里获得consumerTag
s 到队列的列表?