如何让Pika在第一次连接RabbitMQ失败时重试?

5 投票
1 回答
4089 浏览
提问于 2025-04-16 15:28

我正在尝试让我的程序(使用Pika库)在连接RabbitMQ失败时不断重试。根据我看到的Pika文档,有一个叫做SimpleReconnectionStrategy的类可以用来实现这个功能,但它似乎效果不太好。

strategy        = pika.SimpleReconnectionStrategy()
parameters      = pika.ConnectionParameters(server)

self.connection = pika.AsyncoreConnection(parameters, True, strategy)
self.channel    = self.connection.channel()

连接应该使用wait_for_open来等待并设置重连策略。

然而,当我运行这个时,我遇到了以下错误:

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])

在Pika尝试连接的过程中,这些错误不断出现。如果我在客户端运行时启动RabbitMQ服务器,它会成功连接。只是我不喜欢看到这些错误……这些错误正常吗?我是不是做错了什么?

1 个回答

3
import socket

...

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

上面提到的这种方式通常是用来处理问题的。你也可以在每次循环的时候加上 time.sleep(),这样可以让程序稍微等一下再继续,因为有时候服务器会出现故障。在真正的生产代码中,我还会记录重试的次数(或者记录重试花费的时间),如果超过了一定的时间就放弃。有时候,记录一个错误然后让程序崩溃可能是更好的选择。

撰写回答