我有一个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()
函数?
两种选择有什么区别? (似乎做同样的事)
感谢。
答案 0 :(得分:0)
除非有消息和确认消息,否则它自己的drain_events不会产生任何心跳。如果队列空闲,那么最终将关闭连接(由兔子服务器或防火墙)。
你应该做的是同时使用心跳和超时:
while True:
try:
conn.drain_events(timeout=1)
except socket.timeout:
conn.heartbeat_check()
这样即使队列空闲,也不会关闭连接。
除此之外,您可能希望使用重试策略包装整个内容,以防连接断开或出现其他网络错误。