2012-10-30 10 views
5

मेरे पास एक प्रकाशन-सबस्क्राइब उपयोग केस है जहां मैं प्रकाशित पक्ष पर अवरुद्ध करना चाहता हूं जब तक कि प्रत्येक ग्राहक पुष्टि नहीं करता कि उन्होंने प्रकाशक द्वारा भेजे गए संदेश को संभाला है।चैनल.विटफ़ोर कॉन्फर्मर्सऑर्डी ब्लॉक क्यों नहीं है?

मैं (गलत तरीके से?) मान लिया कि मैं अपने समाधान के हिस्से के रूप में RabbitMQ और उसके जावा amqp-client's channel.waitForConfirmsOrDie विधि का उपयोग कर सकता हूं। मुद्दा यह है कि मुझे ऐसा कोई मामला नहीं मिला है जिसमें WaitForConfirmsOrDie वास्तव में अवरुद्ध होगा।

javadocs के अनुसार, waitForConfirmsOrDie माना जाता है:

प्रतीक्षा जब तक सभी संदेशों पिछले कॉल के बाद प्रकाशित या तो ack'd किया गया है या दलाल द्वारा nack'd। अगर किसी भी संदेश को नैक किया गया था, तो प्रतीक्षा करेंफॉर कॉन्फर्मर्सऑर्डी IOException फेंक देगा। जब एक गैर-पुष्टि चैनल पर फोन किया जाता है, तो यह तुरंत वापस आ जाएगा।

यह जांचने के लिए कि यह विधि वास्तव में काम करती है, मैंने this example code from the RabbitMQ website से शुरुआत की।

उदाहरण कोड एक प्रकाशक और उपभोक्ता बनाता है, प्रत्येक अपने स्वयं के अलग धागे पर बनाता है। तब प्रकाशक संदेशों को उपभोग करते समय एक्सचेंज को संदेश भेजता है। ऐसा लगता है कि प्रकाशक को तब तक अवरुद्ध करना चाहिए जब तक कि सभी संदेशों को प्रतीक्षा करने के लिए कॉल के माध्यम से कॉल नहीं किया जाता है .ForConfirmsOrDie()।

यह उदाहरण कोड ऐसा लगता है कि यह पूरी तरह से मेल खाता था जो मैं करने की कोशिश कर रहा था। लेकिन, ऐसा लगता है कि मैंने ऐसा नहीं किया जैसा मैंने सोचा था। असल में, अगर उपभोक्ता धागे में, मैं ऑटो-एकिंग संदेशों को बंद करता हूं, तो प्रतीक्षा करेंफॉर कॉन्फर्मर्सऑर्डी() अभी भी तुरंत लौटता है।

मैं सिर्फ एक सच करने के लिए झूठी बदलकर ऑटो पावती बंद कर दिया: ch.queueDeclare(QUEUE_NAME, false, false, false, null); ch.queueDeclare(QUEUE_NAME, true, false, false, null); (2 आर्ग झूठी बजाय सच है) हो जाता है। मेरा मानना ​​है कि इसका मतलब है कि उपभोक्ताओं द्वारा अबकल को भेजा जाना चाहिए।

तो प्रतीक्षा करेंForConfirmsOrDie() वास्तव में क्या करता है? यह कब ब्लॉक होगा?

अगर प्रतीक्षा करेंफॉरफॉर्म्सऑर्डी जो मैं चाहता हूं वह नहीं करता है, तो प्रकाशक को तब तक इंतजार करने का कोई तरीका है जब तक सभी ग्राहक आगे बढ़ने से पहले कोई संदेश नहीं देते?

उत्तर

7

जहां तक ​​मुझे लगता है कि उन कॉलों को उपभोक्ता से पुष्टि के लिए इंतजार नहीं करना चाहिए। waitForConfirms* विधियों का उद्देश्य यह सुनिश्चित कर रहा है कि आपका संदेश ब्रोकर को दिया गया हो और मूल वितरित/विफल प्रकार की अधिसूचना प्रदान की जा सके। दूसरे शब्दों में, अगर आरएमक्यू नोड्स (या यहां तक ​​कि सभी नोड्स) में से एक विफल/अनुपलब्ध है तो संदेश को सूचित किए बिना संदेश गायब नहीं होगा।

यदि आप basicPublish कॉल से पहले आरएमक्यू को डिस्कनेक्ट या बंद करते हैं तो आप कार्रवाई में यह अपवाद देख सकते हैं।

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