【问题标题】:How do I stop consuming in RabbitMQ with Java and Python clients?如何停止使用 Java 和 Python 客户端在 RabbitMQ 中消费?
【发布时间】:2013-03-21 18:43:28
【问题描述】:

我有使用channel.basicConsume() 的Java 和Python 客户端。在某些时候,我想在不停止整个程序的情况下停止这些消费者。

在带有 Pika 的 Python 中,我已经放置了 channel.stop_consuming() 调用,但是这些会产生我忽略的错误。似乎有效

在 Java 中我不确定如何执行此操作,因为 stop_consume() 似乎不可用。

我看到的所有文档都谈到了创建消费者的所有方法,但我似乎找不到任何可以显示如何阻止它们的东西。

最好的方法是什么?

【问题讨论】:

    标签: java python rabbitmq pika


    【解决方案1】:

    basic_consume 的对应物是basic_cancel。当 rabbitmq 完成取消时,basic_cancel 将触发提供的 on_basic_cancel_ok 回调函数。为您可能仍会收到一些消息的短时间内做好准备。

    见:Pika Channel

    【讨论】:

    • 正确答案次数无限。对于 Java 人员,请使用 Channel#basicCancel(String)
    • 只有在你想停止所有个worker中间发送的黑洞消息时才解绑队列。
    【解决方案2】:

    您应该在一个线程中使用,所以只需中断该线程并让程序的其余部分继续运行

    Thread t = new Thread(){
      public void run(){
        //consumer is in here
      }
    };
    t.start();
    
    // somewhere else later
    t.interrupt();
    

    您可能需要在别处购买 Thread t,将其作为对象的字段而不是局部变量

    【讨论】:

    • 在我的回答中添加了更多信息
    • 这对 RabbitMQ 不利,因为消息会排队。
    • 这是一个可怕的解决方案: 正如@itsafire 提到的那样,它使客户端处于潜在危险状态并在服务器上留下资源(队列)泄漏,顺便说一句,其答案是正确的一个。
    • 我没有在消费者代码中添加任何内容。在您连接到队列的这部分代码中,如果队列是自动删除的,则没有消息将排队,因为没有队列可供它们进入。
    • 什么?这个答案是完整的 B.S.,就像 100% 完全编造的一样。为什么你应该在线程中消费?这不是阻塞操作。因此,首先,因此您不应该在线程中消费,其次,中断线程不会做任何事情,因为线程无论如何都会完成。即使那样,您假设的阻塞 consume 函数将如何处理中断?它不会抛出InterruptedException
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 2019-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    相关资源
    最近更新 更多