2013-02-22 49 views
8

यदि मैं RabbitMQ से जुड़ा हूं और इवेंटिंग बेसिक कॉन्सेमर का उपयोग करके ईवेंट सुन रहा हूं, तो मैं कैसे बता सकता हूं कि मुझे सर्वर से डिस्कनेक्ट किया गया है या नहीं?एक RabbitMQ क्लाइंट कैसे सर्वर से कनेक्शन खो देता है जब बता सकता है?

मुझे पता है कि एक शटडाउन घटना है, लेकिन अगर मैं विफलता अनुकरण करने के लिए अपने नेटवर्क केबल को अनप्लग करता हूं तो यह आग नहीं आता है।

मैंने मॉडलशॉटडाउन ईवेंट और मॉडल पर कॉलबैक अपवाद भी कोशिश की है लेकिन कोई भी काम नहीं कर रहा है।

संपादित करें ----- जिसे मैंने उत्तर के रूप में चिह्नित किया है वह सही है, लेकिन यह मेरे लिए समाधान का केवल एक हिस्सा था। RabbitMQ में निर्मित हार्टबीट कार्यक्षमता भी है। सर्वर इसे विन्यास फाइल में निर्दिष्ट करता है। यह 10 मिनट तक डिफ़ॉल्ट है लेकिन निश्चित रूप से आप इसे बदल सकते हैं।

ग्राहक कनेक्शन फ़ैक्टरी उदाहरण पर अनुरोधित हार्टबीट मूल्य सेट करके दिल की धड़कन के लिए एक अलग अंतराल का भी अनुरोध कर सकता है।

+0

आप कनेक्शन में दिल की धड़कन जोड़ सकते हैं जो सेवा इंटरप्शन का पता लगाएगा – robthewolf

+0

क्या आप अपना पूरा कोड पोस्ट कर सकते हैं? मुझे एक ही समस्या का सामना करना पड़ रहा है। अग्रिम में धन्यवाद। – Pritam

+0

आपको वास्तव में 3 चीजों की आवश्यकता है। 1 कनेक्शन फैक्टरी को एक अनुरोधित हार्टबीट सेट करने की आवश्यकता है। 2 कनेक्शन बनाने के बाद कनेक्शन को चिह्नित उत्तर में वर्णित कनेक्शनशूटडाउन ईवेंट को परिभाषित करें। 3 सुनिश्चित करें कि आपने rabbitmq कॉन्फ़िगरेशन फ़ाइल में इसे सही तरीके से सेटअप किया है। (क्षमा करें मेरे पास वर्तमान में उस हिस्से का हिस्सा नहीं है।) मैं देखूंगा कि क्या मैं बिना किसी कार्यान्वयन विशिष्ट सामग्री के कोड को निकाल सकता हूं। – Kelly

उत्तर

5

मुझे लगता है कि आप सी # लाइब्रेरी का उपयोग कर रहे हैं? (लेकिन यहां तक ​​कि मुझे लगता है कि दूसरों के पास एक समान घटना है)।

आप निम्न कर सकते हैं:

public class MyRabbitConsumer 
{ 
    private IConnection connection; 

    public void Connect() 
    { 
    connection = CreateAndOpenConnection(); 
    connection.ConnectionShutdown += connection_ConnectionShutdown; 
    } 

    public IConnection CreateAndOpenConnection() { ... } 

    private void connection_ConnectionShutdown(IConnection connection, ShutdownEventArgs reason) 
    { 

    } 
} 
+0

मुझे इस कोड को लागू करना चाहिए? – Pritam

0

यह बात का एक उदाहरण है, लेकिन चिह्नित जवाब क्या मुझे इस के लिए नेतृत्व है।

var factory = new ConnectionFactory 
{ 
    HostName = "MY_HOST_NAME", 
    UserName = "USERNAME", 
    Password = "PASSWORD", 
    RequestedHeartbeat = 30 
}; 

using (var connection = factory.CreateConnection()) 
{ 
    connection.ConnectionShutdown += (o, e) => 
    {      
     //handle disconnect        
    }; 

    using (var model = connection.CreateModel()) 
    { 
     model.ExchangeDeclare(EXCHANGE_NAME, "topic"); 
     var queueName = model.QueueDeclare(); 

     model.QueueBind(queueName, EXCHANGE_NAME, "#"); 

     var consumer = new QueueingBasicConsumer(model); 
     model.BasicConsume(queueName, true, consumer); 

     while (!stop) 
     { 
      BasicDeliverEventArgs args;      
      consumer.Queue.Dequeue(5000, out args); 

      if (stop) return; 

      if (args == null) continue; 
      if (args.Body.Length == 0) continue; 

      Task.Factory.StartNew(() => 
      { 
       //Do work here on different thread then this one 
      }, TaskCreationOptions.PreferFairness); 
     } 
    } 
} 

इस बारे में कुछ बातें ध्यान दें।

मैं इस विषय के लिए # उपयोग कर रहा हूं। यह सब कुछ पकड़ लेता है। आमतौर पर आप किसी विषय से सीमित करना चाहते हैं।

मैं प्रक्रिया को समाप्त होने पर निर्धारित करने के लिए "स्टॉप" नामक एक चर सेट कर रहा हूं। आप देखेंगे कि लूप हमेशा के लिए चलता है जब तक कि चर सही नहीं है।

डेक्यू 5 सेकंड तक प्रतीक्षा करता है तो कोई नया संदेश नहीं होने पर डेटा प्राप्त किए बिना छोड़ देता है। यह सुनिश्चित करना है कि हम उस स्टॉप वैरिएबल को सुनें और वास्तव में किसी बिंदु पर छोड़ दें। मूल्य को अपनी पसंद में बदलें।

जब कोई संदेश आता है तो मैं एक नए थ्रेड पर हैंडलिंग कोड उत्पन्न करता हूं। वर्तमान धागा को खरगोश संदेशों को सुनने के लिए आरक्षित किया जा रहा है और यदि एक हैंडलर को संसाधित करने में बहुत लंबा समय लगता है तो मैं नहीं चाहता कि यह अन्य संदेशों को धीमा कर दे। आपके कार्यान्वयन के आधार पर आपको इसकी आवश्यकता हो सकती है या नहीं। हालांकि संदेशों को संभालने के लिए कोड लिखना सावधान रहें। यदि इसे चलाने में एक मिनट लगते हैं और आपके दूसरे संदेश उप-दूसरे बार प्राप्त होते हैं तो आप स्मृति से बाहर या कम से कम गंभीर प्रदर्शन समस्याओं में भाग लेंगे।