【问题标题】:How to consume RabbitMQ messages via pika for some limited time?如何在有限的时间内通过 pika 消费 RabbitMQ 消息?
【发布时间】:2015-01-14 15:51:59
【问题描述】:

pika 教程中的所有示例都以客户端调用start_consuming() 结束,这会启动无限循环。这些例子对我有用。

但是,我不希望我的客户端永远运行。相反,我需要我的客户端消费消息一段时间,例如 15 分钟,然后停止。

我该如何做到这一点?

【问题讨论】:

标签: python python-2.7 rabbitmq pika


【解决方案1】:

您可以使用自己的循环一次使用一条消息,假设您有channelqueue 设置。以下将检查队列是否为空,如果不是,则从中弹出一条消息。

queue_state = channel.queue_declare(queue, durable=True, passive=True)
queue_empty = queue_state.method.message_count == 0

声明一个已经存在的队列,并设置被动标志允许您查询它的状态。接下来我们处理一条消息:

if not queue_empty:
    method, properties, body = channel.basic_get(queue, no_ack=True)
    callback_func(channel, method, properties, body)

这里callback_func是我们正常的回调。当您想以这种方式处理时,请确保将回调注册到队列中。

# DO NOT
channel.basic_consume(callback_func, queue, no_ack=True)

这会使手动消耗做一些奇怪的事情。如果我事先进行了此调用,我已经看到 queue_declare 代码实际上处理了一条消息。

【讨论】:

  • 想必我需要调用channel.close(),这样出口才干净,对吧?退出时我还有什么需要做的吗?
  • 我想我也可以调用这个:方法、属性、body = channel.basic_get(queue, no_ack=True),然后如果不是 body 是 None。你能解释一下为什么建议先检查队列是否为空吗?
  • 是的,您应该关闭频道。我以这种方式检查队列,因为它更清楚发生了什么,例如,您可以等到队列中有 N 条消息后再进行处理。 None 检查也很好。
  • @Mike 我正在尝试在我的本地主机上使用 RabbitMQ,但是使用起来很困难,你能给我任何关于此的指示
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-13
  • 1970-01-01
相关资源
最近更新 更多