Как я могу заставить Пику повторить попытку подключения к RabbitMQ, если в первый раз произойдет сбой? - PullRequest
5 голосов
/ 11 апреля 2011

Я пытаюсь заставить мою программу, которая использует Pika, постоянно повторять попытку подключения к RabbitMQ в случае сбоя.Из того, что я видел в документах Pika, есть класс SimpleReconnectionStrategy, который можно использовать для достижения этой цели, но он, похоже, не очень хорошо работает.настроить стратегию переподключения.

Однако, когда я запускаю это, я получаю следующие ошибки:

error: uncaptured python exception, closing channel <pika.asyncore_adapter.RabbitDispatcher at 0xb6ba040c> (<class 'socket.error'>:[Errno 111] Connection refused [/usr/lib/python2.7/asyncore.py|read|79] [/usr/lib/python2.7/asyncore.py|handle_read_event|435] [/usr/lib/python2.7/asyncore.py|handle_connect_event|443])
error: uncaptured python exception, closing channel <pika.asyncore_adapter.RabbitDispatcher at 0xb6ba060c> (<class 'socket.error'>:[Errno 111] Connection refused [/usr/lib/python2.7/asyncore.py|read|79] [/usr/lib/python2.7/asyncore.py|handle_read_event|435] [/usr/lib/python2.7/asyncore.py|handle_connect_event|443])

Эти ошибки постоянно генерируются, пока Пика пытается подключиться.Если я запускаю сервер RabbitMQ во время работы моего клиента, он подключится.Мне просто не нравится вид этих ошибок ... Они нормальные?Я делаю это неправильно?

1 Ответ

3 голосов
/ 18 июля 2011
import socket

...

while True:
    connectSucceeded = False
    try:
        self.channel    = self.connection.channel()
        connectSucceeded = True
    except socket.error:
        pass
    if connectSucceeded:
        break

Обычно используется что-то подобное вышеописанному. Вы также можете добавлять time.sleep() каждый раз в цикле, чтобы попытаться реже, потому что иногда серверы отключаются. В реальном производственном коде я бы также посчитал количество повторных попыток (или отследил количество времени, потраченного на повторную попытку) и сдал через некоторое время. Иногда лучше регистрировать ошибку и сбой.

...