我正在尝试让我的程序使用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服务器,它将连接。我只是不喜欢看到这些错误......它们是正常的吗?我做错了吗?
答案 0 :(得分:3)
import socket
...
while True:
connectSucceeded = False
try:
self.channel = self.connection.channel()
connectSucceeded = True
except socket.error:
pass
if connectSucceeded:
break
通常使用类似上述的东西。您还可以在每次循环中添加time.sleep()
以减少尝试次数,因为有时服务器会关闭。在实际生产代码中,我还会计算重试次数(或跟踪重试所花费的时间)并在一段时间后放弃。有时最好记录错误并崩溃。