2013-03-08 9 views
6

एक टिकाऊ कतार और इसकी बाइंडिंग रखने का सबसे अच्छा तरीका क्या है लेकिन इसके उपभोक्ताओं को निलंबित कर दिया गया है?खरगोश एमक्यू कतार खपत को निलंबित

उपयोग का मामला है: मैं इसे "क्रैश होने दें" और संदेशों को संभालना बंद करना चाहता हूं अगर हम उन संदेशों का समूह प्राप्त करते रहें जिन्हें हम सौदा नहीं कर सकते हैं (जैसे डेटाबेस डाउन या स्कीमा मुद्दा है) लेकिन चाहेंगे कतार में एकत्रित रहो। यह प्रकाशित करने की अनुमति है लेकिन उपभोग निलंबित है।

मैं तीन समाधान के बारे में सोच सकते हैं:

  1. मैं सभी उपभोक्ताओं कतार करने के लिए बाध्य हो सकता था लगातार संदेश अस्वीकृत कर दिए और फिर से कतार लेकिन यह मैं प्रोग्राम के रूप में करना है का उल्लेख नहीं अपशिष्ट संसाधनों की तरह है तर्क से ऊपर
  2. मैं सभी उपभोक्ताओं पर basic.cancelConsumer कह सकते हैं (नीचे देखें)
  3. या में के मामले मुझे लगता है मैं सभी SimpleMessageListenerContainers कि कतार में बंधे हुए हैं पर shutdown कह सकते हैं।

#1 हम पहले ही कर रहे हैं क्योंकि संदेशों को खारिज कर दिया जा रहा है। समस्या यह है कि अंतहीन होने की तरह यह अंतहीन हो रहा है जबकि विफलता के लूप और यदि आपके लॉगिंग में विफलता है तो और भी संसाधन बर्बाद हो जाते हैं।

#3 आदर्श लगता है लेकिन मुझे कुछ संदेश श्रोताओं के बारे में कुछ पता होना चाहिए और फिर उन्हें बंद करने के लिए सूचित करें। मुझे लगता है कि मैं एक प्रशंसा विनिमय का उपयोग यह सूचित करने के लिए कर सकता हूं कि कतार को निलंबित करने की आवश्यकता है। मुझे लगता है कि इस तर्क के लिए RabbitMQ में कुछ अंतर्निहित होना चाहिए। दूसरा मुद्दा यह है कि आप एक संदेश कंटेनर में एकाधिक कतारों को बांध सकते हैं (सभी कतारों को निलंबित करने की आवश्यकता नहीं हो सकती है)।

#2 के लिए मैं जानता हूँ कि मैं यह कर सकते हैं के साथ cancel the consumer अपने consumerTag लेकिन सवाल (यह सोचते हैं कि इसके बाद के संस्करण करने के लिए सही तरीका है) है, जहां मैं एक कतार में consumerTag रों की सूची मिलता है?

उत्तर

1

यदि आपको उपभोक्ता को रोकने की आवश्यकता है तो केवल मूल रद्द करें, यह करने का तरीका है।

टिकाऊ कतार होने के कारण आप कतार घोषित करते समय हल करते हैं: durable=trueauto_delete=false

लगातार संदेशों होने निर्धारित किया जाता है जब आप उन्हें प्रकाशित: delivery_mode=2.

प्रत्येक उपभोक्ता अपने आप उपभोक्ता टैग है। जब भी आपको कतार से कोई संदेश मिलता है, लिफाफे में उपभोक्ता टैग होना चाहिए और आपको उस टैग के साथ मूल रद्द करना चाहिए।

AFAIK, आपके पास उपभोक्ता ए में कॉन 1 नहीं हो सकता है और उस उपभोक्ता के लिए एक अलग कनेक्शन पर मूल रद्द कर सकता है। मैं इस पर गलत हो सकता है।

+0

धन्यवाद। मुझे पता है कि उपरोक्त की तरह खरगोश में कतार कैसे घोषित करें।ऐसा लगता है कि मुझे अपने उपभोक्ताओं को अपने आप प्रबंधित करना होगा, जिस मार्ग से मैं पहले से नीचे जा रहा हूं। यह अच्छा होगा अगर खरगोश के पास कतार की खपत को निलंबित करने का विकल्प होता है। –

+0

एकमात्र चीज जो आप किसी कनेक्शन से कर सकते हैं वह इसे व्यवस्थापक से बंद करने के लिए मजबूर करना है जो वास्तव में आप जो खोज रहे हैं –

1

यह समाधान विशिष्ट है। मेरे उत्तर से इसकी मूल रूप से #3 है।

मैं ऐसी सेवा बनाए रखता हूं जिसमें Map<String,CustomSimpleMessageListenerContainer> कतार नाम के कस्टम विस्तारित SimpleMessageListenerContainer पर है।

कुछ निश्चित अपवादों के बाद मैं एक "आतंक" संदेश भेजता हूं जो उपभोक्ता को बंद करने के लिए सेवा द्वारा प्राप्त विशेष कतार में जाता है।

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