2010-08-10 14 views
9
while (true) 
{ 
    BasicDeliverEventArgs e = (BasicDeliverEventArgs)Consumer.Queue.Dequeue(); 
    IBasicProperties properties = e.BasicProperties; 
    byte[] body = e.Body; 
    Console.WriteLine("Recieved Message : " + Encoding.UTF8.GetString(body)); 
    ch.BasicAck(e.DeliveryTag, false); 
} 

यह है कि हम क्या करते हैं जब हम एक ओर जहां लूप subscription..We उपयोग के द्वारा संदेश पुन: प्राप्त करें क्योंकि हम उपभोक्ता Continously..what सुनने के लिए अगर मैं यह और भी आधारित बनाना चाहते चाहते है .. कि जब एक नया संदेश उस समय कतार में आता है केवल उपभोक्ता किसी भी तरह के समान घटना पर message..or ..RabbitMQ सी # API ईवेंट आधारित संदेश खपत

+0

क्या आप EventingBasicConsumer का उपयोग कर सकते हैं? http://www.java2s.com/Open-Source/CSharp/Message/RabbitMQ/RabbitMQ/Client/Events/EventingBasicConsumer.cs.htm – maxfridbe

+0

यह भी देखें: http://stackoverflow.com/questions/12499174/rabbitmq- सी-तेज-चालक-स्टॉप-प्राप्त करने वाले संदेश – Babak

उत्तर

7

आप वर्तमान में Consumer.Queue.Dequeue पर अवरुद्ध कर रहे हैं() सेवन करना चाहिए। अगर मैं आपके प्रश्न को सही ढंग से समझता हूं, तो आप असीमित रूप से संदेशों का उपभोग करना चाहते हैं।

ऐसा करने का मानक तरीका चैनल के लिए IBasicConsumer (शायद DefaultBasicConsumer उपखंडित करके set it as the consumer लिखना होगा)।

इसके साथ समस्या यह है कि आपको बहुत होना चाहिए जो आप IBASicConsumer.HandleBasicDelivery में करते हैं। यदि आप किसी भी सिंक्रोनस AMQP विधियों का उपयोग करते हैं, जैसे कि मूल.publish, आपको एक मृत-लॉक मिलेगा। यदि आप ऐसा कुछ भी करते हैं जो लंबे समय तक लेता है, तो आप कुछ अन्य समस्याओं में भाग लेंगे।

यदि आपको सिंक्रोनस विधियों या लंबी चलने वाली कार्रवाइयों की आवश्यकता है, तो आप इसे करने के सही तरीके के बारे में क्या कर रहे हैं। Subscription पर एक नज़र डालें; यह एक आईबीएसिक कॉन्स्यूमर है जो संदेश का उपभोग करता है और उन्हें आपके लिए कतार में रखता है।

यदि आपको और मदद की ज़रूरत है, तो पूछने के लिए एक शानदार जगह rabbitmq-चर्चा मेलिंग सूची है।

+5

सारांश: IModel betweenthreads साझा न करें। नए कनेक्शन/मॉडल बनाने के लिए यह काफी सस्ता है (डीबगिंग समवर्ती बग के लिए लागत की तुलना में)। –

+0

.नेट क्लाइंट उपयोगकर्ता गाइड के अनुसार आवेदन हैंडलर IMODEL.BasicPublish को बिना डेडलॉक के कॉल कर सकते हैं क्योंकि वे एसिंक ऑपरेशंस हैं। लेकिन हैंडलर से क्यूईडेक्लेयर या बेसिक कैंसल को कॉल करने से परिणामस्वरूप डेडलॉक हो जाएगा। – maulik13

4

मुझे यह समस्या थी और मुझे कोई जवाब नहीं मिला, इसलिए एक प्रदर्शन प्रोजेक्ट बनाया गया ताकि RabbitMQ सदस्यता बढ़ सके। संदेश प्राप्त होने पर नेट ईवेंट। सब्सक्रिप्शन यूआई (माइकेस में) को छोड़कर अपने स्वयं के धागे पर चलता है, यह काम करने के लिए स्वतंत्र होता है।

मैं मनोरंजक अपने प्रोजेक्ट RabbitEar फोन के रूप में यह शक्तिशाली RabbitMQ से संदेश मैं RabbitMQ साइट के साथ इस साझा करने के लिए इसलिए अगर उन्हें लगता अपने मूल्य के वे वहाँ उदाहरण में एक लिंक/कोड शामिल कर सकते हैं करना चाहते हैं के लिए बाहर सुनता है।

पर http://rabbitears.codeplex.com/

धन्यवाद साइमन

इसे देखें
9

एक इवेंट उपभोक्ता के बजाय एक अवरुद्ध एक के लिए RabbitMQ.Client.Events.EventingBasicConsumer का उपयोग करें।

+3

कृपया ध्यान दें कि [EventingBasicConsumer] (http://www.rabbitmq.com/releases/rabbitmq-dotnet-client/v2.8.1/rabbitmq-dotnet-client-2.8.1-client-htmldoc/html/type-RabbitMQ। Client.Events.EventingBasicConsumer.html) वर्तमान में प्रयोगात्मक के रूप में सूचीबद्ध है। – WhiteKnight

+0

मेरे पास सी # में ऐसा करने के तरीके की मेरी वेबसाइट पर एक पूर्ण उदाहरण है। http://www.jarloo.com/listening-to-rabbitmq-events/ – Kelly

संबंधित मुद्दे