保持持久队列及其绑定但暂停其使用者的最佳方法是什么?
用例是:我想“让它崩溃”并停止处理消息,如果我们不断收到一堆我们无法处理的消息(例如数据库已关闭或架构问题)但想保留聚合到队列。这是允许发布但暂停消费。
我可以想到三个解决方案:
basic.cancelConsumer
(见下文)shutdown
。 #1
我们已经在做消息被拒绝了。问题是这最终会像一个无限的失败循环,如果您的日志记录失败甚至更多的资源被浪费。
#3
似乎很理想,但我必须知道所有消息监听器,然后通知他们关闭。我想我可以使用扇出交换来通知队列需要暂停。我觉得RabbitMQ必须内置这个逻辑。另一个问题是您可以将多个队列绑定到消息容器(并非所有队列都可能需要挂起)。
对于#2
我知道我可以cancel the consumer使用consumerTag
,但问题(假设这是正确的方法)我在哪里可以获得{{ 1}}到队列?
答案 0 :(得分:1)
如果您需要停止消费者,那么只需拨打基本取消,就可以这样做了。
拥有持久队列是您在声明队列时解决的问题:durable=true
auto_delete=false
。
发布持久消息时确定:delivery_mode=2.
每个消费者都拥有自己的消费者标签。每当您从队列中收到消息时,信封应该包含消费者标签,您应该使用该标签调用基本取消。
AFAIK,您不能在conn 1中拥有消费者A,并在不同的连接上为该消费者调用基本取消。我可能错了。
答案 1 :(得分:1)
此解决方案具体为spring-amqp。它的答案基本上是#3
。
我维护的服务具有Map<String,CustomSimpleMessageListenerContainer>
队列名称,以自定义扩展SimpleMessageListenerContainer
。
在发出一定数量的异常后,我发送一条“恐慌”消息,该消息进入服务收到的特殊队列以关闭消费者。