发送确认时Rabbitmq断开连接

时间:2015-02-08 12:03:23

标签: python rabbitmq pika

我的rabbitmq使用者处理传入的消息,如以下示例所示: http://pika.readthedocs.org/en/latest/examples/asynchronous_consumer_example.html

我的代码和示例之间的区别在于,在我的代码中,每条消息都需要花费大量时间来处理。 (超过一个小时)。

当消息完成处理时,执行以下行:

self._channel.basic_ack(delivery_tag)

然而,在此之后,我收到一个on_connection_closed事件,导致我的消费者重新连接。

问题是ack未送达,已经处理过的消息被发送给另一个消费者并再次处理。

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

经过长时间的研究,发现了问题所在。

显然,尽管消费者实现具有异步回调功能,但所有这些都是从同一个线程调用的。

如果“on_message”方法正在执行很长时间,它会阻止线程向服务器发送心跳消息,这会导致它在一段时间后关闭连接。

解决方案是将消息处理移动到单独的线程。但是有一个问题。为了防止消费者同时处理多个消息,必须在on_channel_open方法中添加以下行:

channel.basic_qos(prefetch_count=self._num_of_cores)