2011-04-11 98 views
5

我试图让我的程序使用Pika,在失败时不断重试连接到RabbitMQ。从我看到的Pika文档中,有一个SimpleReconnectionStrategy类可以用来实现这一点,但它似乎并没有很好地工作。如果第一次失败,我如何才能让Pika重新连接到RabbitMQ?

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

这些错误是不断抛出,而鼠兔尝试连接。如果我在客户端运行时启动RabbitMQ服务器,它将连接。我只是不喜欢看到这些错误...他们是否正常?我做错了吗?

回答

3
import socket 

... 

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

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

相关问题