【发布时间】:2014-11-15 23:30:04
【问题描述】:
我正在使用 pika 的 twisted protocol adapter。当我成功处理消息后,我使用此调用向 RabbitMQ 发送确认:
channel.basic_ack(delivery_tag=delivery_tag)
basic_ack 调用似乎是异步触发的,但它没有返回延迟,因此我无法添加回调或 errback。我现在遇到了一个小问题,因为我想等待队列中的某个消息,处理它并关闭反应器,即
channel.basic_ack(delivery_tag=delivery_tag)
reactor.stop()
当然,反应堆在消息发送之前就关闭了。我正在通过延迟关机来解决这个问题
channel.basic_ack(delivery_tag=delivery_tag)
reactor.callLater(5, reactor.stop)
但这似乎是一种非常“hacky”的方式。我希望能够执行以下操作:
d = channel.basic_ack(...)
d.addBoth(lambda x: reactor.shutdown())
我在这里遗漏了一些明显的东西吗?真的不可能在 ack 调用结束时链接回调吗?
【问题讨论】:
-
您希望回调发生在什么时候?
-
当确认已经成功发送到 RabbitMQ 时,基本上是“谢谢我已经完成了你让我做的工作,现在我要关机了”
-
RabbitMQ 协议是否包含 ack for acks?如果没有,你怎么知道ack已经成功发送到RabbitMQ?
-
不,它没有,但如果我使用阻塞调用,我会阻塞直到执行恢复或引发异常。 pika 的扭曲包装类似乎为某些调用返回延迟,但在 ack 调用的情况下,它只是异步执行它,但不返回任何东西。我可能误解了它的工作原理,因此我的问题
-
我怀疑 pika 的 API 返回 Deferred 的情况是 RabbitMQ 服务器返回响应的情况。很容易看出为什么在这些情况下返回 Deferred 是有意义的——因为当请求/响应 API 是异步的时,Deferred 是获取包含在服务器响应中的数据的唯一方法。在这种情况下,也很容易看出 Deferred 何时触发 - 当从服务器接收到响应时它会触发。如果服务器没有发送响应,那么 Deferred 何时触发就不太明显了。与阻塞代码的比较只让我们到目前为止。
标签: twisted pika python-pika