2010-11-25 21 views
5

मैं नेट प्रोग्राम में ActiveMQ का उपयोग कर रहा हूं और मुझे संदेश-ईवेंट के साथ बाढ़ आ रही है।मैं अपने सी # ऐप में ActiveMQ से आने वाले संदेशों की मात्रा को कैसे थका सकता हूं?

संक्षेप में जब मुझे कतार-घटना 'ऑन मैसेज (इमेजेज प्राप्त संदेश) प्राप्त होता है, तो मैंने संदेश को एक आंतरिक कतार में डाल दिया जिसमें से एक्स थ्रेड उनकी बात करते हैं।

पहले मेरे पास था: सत्र को बनाते समय 'स्वीकृति मोड। ऑटो स्वीकृति' तो मुझे लगता है कि कतार में सभी संदेश चूस गए हैं और मेमोरी कतार में डाल दिया गया है (जो दुर्घटना के बाद से जोखिम भरा है, सब कुछ है खो गया)।

तो मैंने उपयोग किया: सत्र स्वीकार करते समय 'पावती संदेश। क्लाइंट स्वीकार करें', और जब कोई कार्यकर्ता संदेश के साथ तैयार होता है तो यह संदेश पर 'प्रतिबद्ध()' विधि कहता है। हालांकि, अभी भी सभी संदेश कतार से नीचे चूस गए हैं।

मैं इसे कैसे कॉन्फ़िगर कर सकता हूं कि केवल एक एक्स मात्रा में संदेशों को संसाधित किया जा रहा है या आंतरिक कतार में हैं, और यह कि सबकुछ तुरंत 'डाउनलोड नहीं किया जा रहा है'?

+0

हालांकि मैंने कभी भी ActiveMQ को छुआ नहीं है - क्या आप इसे चारों ओर फ़्लिप नहीं कर सकते हैं: ActiveMQ श्रोताओं के साथ एन थ्रेड सेट करें, और सुनो ईवेंट के भीतर संदेशों को संसाधित करें? –

+0

@ विल ह्यूजेस: मेरा पूरा कार्यक्रम एक असीमित तरीके से लिखा गया है। तो कॉलबैक के साथ भी डीबी एक्सेस असीमित रूप से किया जाता है। तो मैं इस कार्यक्रम में नहीं रह सकता। – Toad

उत्तर

3

क्या आप .NET 4.0 पर हैं? आप ब्लॉकिंग कोलेक्शन का उपयोग कर सकते हैं। इसे अधिकतम रकम में सेट करें। जैसे ही एक थ्रेड अतिरिक्त तत्व में डालने का प्रयास करता है, तब तक ऑपरेशन तब तक अवरुद्ध हो जाएगा जब तक कि संग्रह थ्रेसहोल्ड से नीचे न हो जाए।

शायद यह थ्रॉटलिंग के लिए ऐसा करेगा?

आरएक्स ढांचे में थ्रॉटलिंग के लिए एक एपीआई भी है, लेकिन मुझे नहीं पता कि यह कैसे कार्यान्वित किया जाता है। यदि आप अपने कतार स्रोत को अवलोकन के रूप में कार्यान्वित करते हैं, तो यह एपीआई आपके लिए उपलब्ध हो जाएगी, लेकिन मुझे नहीं पता कि यह आपकी आवश्यकताओं को हिट करता है या नहीं।

+0

महान जवाब! एक जादू की तरह काम करता है। धन्यवाद – Toad

2

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

सभी विकल्प के लिए एनएमएस विन्यास पेज का संदर्भ लें: http://activemq.apache.org/nms/configuring.html

सादर

टिम। FuseSource.com

+0

bish: दुर्भाग्य से, मैं clientacknowledge को सेट करने के बावजूद, कतार के रूप में ज्यादा घटनाओं के रूप में वहाँ कतार में संदेश होते हैं सक्रिय हो जाएगा। मैंने कतार में 10.000 messqges के साथ इसका परीक्षण किया और मुझे कुछ भी स्वीकार किए बिना निकाल दिया जाएगा। इसे रोकने का एकमात्र तरीका यह है कि जब तक मैंने इसे संसाधित नहीं किया तब तक मैसेज को रोकना। – Toad

+0

ध्वनि की तरह अपने प्रोग्रामिंग मॉडल बेहतर तुल्यकालिक के उपयोग के द्वारा अनुकूल किया जाएगा कॉल प्राप्त है, तो आप यह सब आप की तरह थ्रॉटल कर सकते हैं। संदेश प्रणाली का बिंदु संदेश जितनी जल्दी हो सके वितरित करना है, आपके ऐप को थ्रॉटलिंग से निपटने की ज़रूरत है। –