2012-12-18 29 views
5

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

अगला चरण एक संदेश श्रोता को एक xa कतार में जोड़ना है जो आने वाले संदेशों की समानांतर प्रक्रिया के लिए अनुमति देगा। कुछ संदेश लंबे समय तक चलने वाले कार्यों में शामिल होंगे, इसलिए बुनियादी विचार onMessage विधि से कार्यकर्ता धागे को जन्म देना है।

इंटरनेट के माध्यम से मेरी लंबी यात्रा पर मैं this discussion पर आया, जहां प्रतिभागियों में से एक ने उल्लेख किया कि वह ऐसा नहीं करेगा लेकिन कार्य के लिए एक अतिरिक्त आंतरिक कतार का उपयोग करें: (एकल थ्रेडेड) संदेश श्रोता तब बस पकड़ लेगा इनबाउंड कतार से संदेश और एक आंतरिक कतार के लिए नए संदेश बनाते हैं, जहां उस आंतरिक कतार के दूसरे छोर पर कुछ कार्यकर्ता धागे आने वाले संदेशों के लिए लड़ते हैं। इनबाउंड संदेशों को तब स्वीकार किया जाएगा जब वे "आंतरिक" कतार में "कॉपी" हो जाएंगे (जो मेरे लिए ठीक है)। क्योंकि श्रोता अगर पूल से सभी धागे में व्यस्त हैं, को ब्लॉक कर सकता है, -

दुर्भाग्य से वे कहना नहीं आता कि क्यों यह बेहतर होगा onMessage विधि से कार्यकर्ता धागे अंडे नहीं करने के लिए। संदेश श्रोता

  • एक आंतरिक कतार इस्तेमाल की onMessage विधि से

    • प्रारंभ कार्यकर्ता धागे
    "कार्यकर्ता धागे को संदेश भेजने के लिए": तो मैं पेशेवरों और डिजाइन निर्णय के लिए विपक्ष की तलाश में हूँ
  • उत्तर

    3

    लेन-देन अलग-अलग सीमाओं (या प्रक्रियाओं) को कतार से पढ़ने के लिए अलग करता है या नहीं, यह संदेश आता है कि संदेश आदेश महत्वपूर्ण है या नहीं। जाहिर है अगर आदेश महत्वपूर्ण है, तो एक धागा स्वाभाविक रूप से उस आदेश को बनाए रखता है, जबकि कई धागे ऐसी गारेंटी प्रदान नहीं करेंगे।

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

    यदि आपका प्रश्न बताता है, तो आप संदेशों को छोड़ने के बारे में बहुत चिंतित नहीं हैं तो java.util.concurrent.BlockingQueue प्रत्येक सिंगल सर्विसिंग के साथ आंतरिक कतारों के लिए आपको जो चाहिए उसे लगता है।