我正在尝试使我的程序使用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服务器,它将连接。我只是不喜欢看到这些错误...它们正常吗?我做错了吗?

最佳答案

import socket

...

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

通常使用类似上面的东西。您还可以在循环中每次添加time.sleep(),以减少尝试频率,因为有时服务器确实会停机。在实际的生产代码中,我还将计算重试次数(或跟踪重试所花费的时间),并在一定间隔后放弃。有时最好记录一个错误并崩溃。

关于python - 如果Pika首次失败,如何使Pika重试连接?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5616408/

10-12 22:06