2011-04-11 16 views
5

मैं अपने प्रोग्राम को प्राप्त करने की कोशिश कर रहा हूं, जो पिका का उपयोग करता है, लगातार विफलता पर 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() भी कम बार कोशिश करने के लिए जोड़ सकते हैं क्योंकि कभी-कभी सर्वर नीचे जाते हैं। वास्तविक उत्पादन कोड में मैं रीट्रीज़ की संख्या भी गिनता हूं (या पुनः प्रयास करने में व्यतीत समय की मात्रा को ट्रैक करता हूं) और कुछ अंतराल के बाद छोड़ देता हूं। कभी-कभी त्रुटि और क्रैश लॉग करना बेहतर होता है।