10

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

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

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

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

#1我们已经在做,因为消息被拒绝了。问题是这最终就像一个无限的while循环失败,如果你记录这个失败,就会浪费更多的资源。

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

因为#2我知道我可以用它来取消消费者consumerTag,但问题(假设这是执行上述操作的正确方法)是我从哪里获得consumerTags 到队列的列表?

4

2 回答 2

3

如果您需要停止消费者,那么只需调用基本取消,这就是这样做的方法。

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

当您发布它们时确定具有持久性消息:delivery_mode=2.

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

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

于 2013-03-08T18:58:16.773 回答
2

这个解决方案是特定的。它基本上#3来自我的回答。

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

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

于 2013-03-16T21:23:43.173 回答