如果第一次失败,如何让Pika重新连接到RabbitMQ?

dav*_*ave 5 python amqp rabbitmq

我正在尝试让我的程序使用Pika,在失败时不断重试连接到RabbitMQ.从我所见过的鼠兔文档的,还有可以用来accompish这个SimpleReconnectionStrategy类,但它似乎并没有被工作得很好.

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

self.connection = pika.AsyncoreConnection(parameters, True, strategy)
self.channel    = self.connection.channel()
Run Code Online (Sandbox Code Playgroud)

连接应该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])
Run Code Online (Sandbox Code Playgroud)

当Pika试图连接时,这些错误不断被抛出.如果我在客户端运行时启动RabbitMQ服务器,它将连接.我只是不喜欢看到这些错误......它们是正常的吗?我做错了吗?

Mic*_*lon 3

import socket

...

while True:
    connectSucceeded = False
    try:
        self.channel    = self.connection.channel()
        connectSucceeded = True
    except socket.error:
        pass
    if connectSucceeded:
        break
Run Code Online (Sandbox Code Playgroud)

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