2010-10-29 15 views
5

में मल्टीथ्रेडेड जेएमएस प्राप्त हो रहा है मैं एक कतार से जेएमएस संदेश प्रसंस्करण के लिए एक बहुप्रचारित कार्यान्वयन लिखने की कोशिश कर रहा हूं।वसंत

मैंने डिफॉल्ट मैसेज लिस्टनर कंटैनर और सरल मैसेज लिस्टरनर कंटेनर कक्षाओं के साथ प्रयास किया है।

मेरी समस्या यह है कि ऐसा लगता है कि संदेश लिस्टनर वर्ग का केवल एक ही उदाहरण तत्काल हो जाता है, इससे कोई फर्क नहीं पड़ता कि मैं इसे कैसे कॉन्फ़िगर करता हूं। यह मुझे अनावश्यक रूप से स्टेटलेस या थ्रेड-सुरक्षित संदेश लिस्टर कार्यान्वयन लिखने के लिए मजबूर करता है, क्योंकि मेरे पास ListenerContainer एकाधिक थ्रेड (concurrentConsumers = 8) का उपयोग करने के लिए कॉन्फ़िगर किया गया है।

क्या इसका कोई स्पष्ट समाधान है कि मैं अनदेखा कर रहा हूं?

उत्तर

5

यह डिज़ाइन द्वारा है। MessageListener एक निर्भरता है जिसे आप वसंत में इंजेक्ट करते हैं - इसमें नए लोगों को तुरंत चालू करने का कोई तरीका नहीं है।

यह बलों मुझे अनावश्यक रूप से राज्यविहीन या धागे की सुरक्षित messageListener कार्यान्वयन

लिखने के लिए आपको एक बुरी बात की तरह है कि ध्वनि बनाते हैं। अपना MessageListener बनाना बहुत अच्छा विचार है, वसंत सिर्फ अन्यथा करने के लिए प्रलोभन को हटा देता है।

+0

मुझे समझ में नहीं आता है। मैं अपना संदेश लिस्टर बना रहा हूं। मैं बस समानांतर में चीजों को संसाधित करने के लिए अपने मशीन के बहु-कोर का लाभ उठाना चाहता हूं। –

+2

@Iker: हां, और MessageListenerContainer ऐसा करने के लिए कई धागे उत्पन्न करेगा, सभी थ्रेड आपके 'MessageListener' के समान उदाहरण का उपयोग करते हुए। कई श्रोताओं को पैदा करना अक्षम और अनावश्यक है। – skaffman

+0

ठीक है, मैं समझता हूं। लेकिन आइए कहें कि प्रत्येक जेएमएस संदेश के लिए आपको नौकरी को संसाधित करना होगा जिसमें कुछ सेकंड लगते हैं। मैं प्रत्येक संदेश को संसाधित करने के लिए उदाहरणों का एक पूरी तरह से अलग सेट का उपयोग करने में सक्षम होना चाहता हूं। क्या मुझे संदेश लिस्टनर से थ्रेड फेंकना चाहिए? –

3

शायद यह उत्तर बहुत देर हो चुकी है, लेकिन इससे अन्य लोगों को इसका फायदा हो सकता है जो इसे खोज रहे हैं। संक्षेप में, उत्तर CommonsPoolTargetSource और ProxyFactoryBean का उपयोग कर रहा है।

जानकारी के लिए इस लिंक पर चेक आउट: http://forum.springsource.org/showthread.php?34595-MDB-vs-MDP-concurrency

आप विषय के लिए इसी तरह कुछ करना चाहते हैं, इस जाँच: https://stackoverflow.com/a/12668538/266103

1

"concurrentConsumers" का विन्यास सिर्फ समवर्ती संदेश संसाधित करने के लिए पर्याप्त है। इसका मतलब यह नहीं है कि आपके पास MessageListenerContainer के "n" उदाहरण होंगे। MessageListenerContainer संदेशों को संसाधित करने के लिए आंतरिक रूप से "कार्य" का विस्तार कर सकता है। वैकल्पिक रूप से, अंतर्निहित कार्यों/धागे से जुड़ी जानकारी देखने के लिए आपको तदनुसार अपना लॉगिंग कॉन्फ़िगर करना पड़ सकता है।

अधिक जानकारी के लिए "Tuning JMS message consumption in Spring" देखें।