RabbitMQ心跳与连接排除事件超时

时间:2015-11-18 17:29:31

标签: python timeout rabbitmq heartbeat kombu


我有一个rabbitmq服务器和一个使用kombu的am​​qp使用者(python) 我已将我的应用程序安装在具有防火墙的系统中,该防火墙在1小时后关闭空闲连接。
这是我的amqp_consumer.py:

try:
    # connections
    with Connection(self.broker_url, ssl=_ssl, heartbeat=self.heartbeat) as conn:
        chan = conn.channel()
        # more stuff here
        with conn.Consumer(queue, callbacks = [messageHandler], channel = chan):
        # Process messages and handle events on all channels
        while True:
            conn.drain_events()

except Exception as e:
    # do stuff

我想要的是,如果防火墙关闭连接,那么我想重新连接。我应该使用心跳参数还是应该将超时参数(3600秒)传递给drain_events()函数?
两种选择有什么区别? (似乎做同样的事) 感谢。

1 个答案:

答案 0 :(得分:0)

除非有消息和确认消息,否则它自己的drain_events不会产生任何心跳。如果队列空闲,那么最终将关闭连接(由兔子服务器或防火墙)。

你应该做的是同时使用心跳和超时:

while True:
    try:
        conn.drain_events(timeout=1)
    except socket.timeout:
        conn.heartbeat_check()

这样即使队列空闲,也不会关闭连接。

除此之外,您可能希望使用重试策略包装整个内容,以防连接断开或出现其他网络错误。