gpt4 book ai didi

java - RabbitMQ 暂停队列消费

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:34:33 29 4
gpt4 key购买 nike

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

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

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

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

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

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

对于 #2 我知道我可以 cancel the consumer与它的 consumerTag 但问题(假设这是执行上述操作的正确方法)是我从哪里获取 consumerTag 的列表到队列?

最佳答案

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

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

具有持久消息是在您发布消息时确定的:delivery_mode=2。

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

据我所知,您不能在 conn 1 中拥有消费者 A 并在不同的连接上为该消费者调用基本取消。我在这方面可能是错的。

关于java - RabbitMQ 暂停队列消费,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15300017/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com