7


我有一个rabbitmq 服务器和一个使用kombu 的amqp 消费者(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()函数?
两种选择有什么区别?(似乎也是如此)。
谢谢。

4

1 回答 1

1

drain_events 本身不会产生任何心跳,除非有消息要消费和确认。如果队列是空闲的,那么最终连接将被关闭(通过兔子服务器或防火墙)。

您应该做的是同时使用心跳和超时,如下所示:

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

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

除此之外,您可能希望使用重试策略来包装整个事情,以防连接关闭或其他一些网络错误。

于 2018-01-14T13:33:22.987 回答