2011-04-11 14 views
5

Sürekli olarak RabbitMQ'ya bağlanmayı tekrar denemek için Pika kullanan programımı almaya çalışıyorum. Pika dokümanlarından gördüğüm kadarıyla, bunu gerçekleştirmek için kullanılabilecek bir SimpleReconnectionStrategy sınıfı var ama çok iyi çalışmıyor gibi görünüyor.Pika, ilk kez başarısız olursa RabbitMQ'ya bağlanmayı tekrar denemeyi nasıl sağlayabilirim?

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

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

bağlantısı wait_for_open ve kurulum yeniden bağlanma stratejisi olmalıdır. Bunu çalıştırdığınızda

Ancak, ben aşağıdaki hatalar atılmış olsun: Pika bağlanmaya çalışır iken

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

Bu hatalar sürekli atılır. İstemcim çalışırken RabbitMQ sunucusunu başlatırsam, bağlanır. Bu hataları görmekten hoşlanmıyorum ... Normal mi? Bunu yanlış mı yapıyorum?

cevap

3
import socket 

... 

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

Yukarıdaki gibi bir şey genellikle kullanılır. Daha az sıklıkta denemek için döngü boyunca her zaman time.sleep()'u da ekleyebilirsiniz, çünkü bazen sunucular aşağı iner. Gerçek üretim kodunda, yeniden deneme sayısını da (ya da yeniden denemenin zamanını takip ederek) saydım ve bir süre sonra vazgeçtim. Bazen bir hatayı ve kilitlenmeyi günlüğe kaydetmek daha iyidir.