2015-11-18 5 views
7


У меня есть сервер rabbitmq и потребитель-amqp (python) с помощью комбу.
Я установил свое приложение в систему с брандмауэром, который закрывает незанятые соединения через 1 час.
Это мой amqp_consumer.py:RabbitMQ heartbeat vs connection drain events timeout

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 

то, что я хочу, что если брандмауэр закрыл соединение, то я хочу, чтобы восстановить. должен ли я использовать аргумент heartbeat или должен передать аргумент таймаута (3600 секунд) функции drain_events()?
Каковы различия между обоими параметрами? (похоже, делает то же самое).
Спасибо.

ответ

0

Дренажные_венты на своем собственном не произведут никаких сердечных сокращений, если нет сообщений, которые нужно потреблять и признавать. Если очередь неактивна, тогда соединение будет закрыто (сервером кролика или вашим брандмауэром).

Что вы должны сделать, это использовать как сердцебиение и тайм-аут, как так:

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

Таким образом, даже если очередь находится в режиме ожидания соединение не будет закрыто.

Кроме того, вы можете обернуть все это политикой повтора в случае, если соединение закрывается или какая-либо другая сетевая ошибка.