2010-09-28 14 views
14

क्या खिलाफ सर्वलेट 3.0 अतुल्यकालिक सुविधा के बीच अलग है:सर्वलेट 3.0 अतुल्यकालिक

old servlet impl 
doGet(request,response) { 
Thread t = new Thread(new Runnable() 
    void run(){ 
     // heavy processing 
     response.write(result) 
    } 
} 
t.start(); 

सर्वलेट 3.0 अगर मैं एक धागा बर्बाद भारी प्रसंस्करण करने के लिए - मैं कंटेनर में एक और धागा कमाते हैं, लेकिन मैं इसे बर्बाद में भारी प्रसंस्करण ... :(

किसी ने मदद कर सकते हैं?

+7

यदि नीचे दिए गए किसी भी उत्तर में आप जो खोज रहे थे, क्या आप इसे इस तरह चिह्नित करें? –

उत्तर

2

सर्वलेट 3.0 async सुविधा http कनेक्शन खुला रखने के लिए, लेकिन किसी भी अप्रयुक्त धागे जब अनुरोध तुरंत सेवा नहीं किया जा सकता है जारी करने के लिए प्रदान करता है, लेकिन कुछ के आयोजन के लिए प्रतीक्षा कर रहा है होने या उदाहरण के लिए जब यो आप कुछ धूमकेतु/रिवर्स AJAX एप्लिकेशन लिख रहे हैं। उपर्युक्त मामले में आप पूरी तरह से एक नया धागा बना रहे हैं, इसलिए यह आपके लिए कोई फर्क नहीं पड़ता है जब तक आप कुछ ईवेंट के लिए अनुरोध का इंतजार नहीं करना चाहते।

शुभकामनाओं सहित, केशव

23

यह काम नहीं करेगा। एक बार आपकी doGet विधि समाप्त हो जाने पर, प्रतिक्रिया पूरी हो जाती है और ग्राहक को वापस भेज दी जाती है। आपका धागा अभी भी चल रहा है या नहीं भी हो सकता है, लेकिन यह अब प्रतिक्रिया को बदल नहीं सकता है।

सर्वलेट 3.0 में नई एसिंक सुविधा क्या है, यह है कि यह आपको किसी अन्य अनुरोध को संसाधित करने के लिए अनुरोध थ्रेड को मुक्त करने की अनुमति देता है। क्या होता है निम्नलिखित है:

RequestThread: |-- doGet() { startAsync() } // Thread free to do something else 
WorkerThread:     |-- do heavy processing --| 
OtherThread:           |-- send response --| 

महत्वपूर्ण बात यह है कि एक बार RequestThreadstartAsync(...) के लिए एक कॉल के माध्यम से अतुल्यकालिक प्रसंस्करण शुरू कर दिया है, यह कुछ और क्या करना मुक्त है। यह उदाहरण के लिए, नए अनुरोध स्वीकार कर सकते हैं। यह थ्रूपुट में सुधार करता है।

+0

जहां तक ​​मेरी समझ जाती है, 'requestTsread' 'startAsync (...)' को कॉल करने के बाद कुछ और करने के लिए 'मुक्त' नहीं होगा, यह तब तभी मुफ़्त होगा जब 'RequestThread' ने अपना काम पूरा कर लिया है, उदाहरण के लिए, यदि 'doGet()' 'tryGs()' को 'doGet()' 'RequestThread' के भीतर बुलाया जाता है तो एक बार 'doGet()' निष्पादित हो जाता है। – user454322

+0

सटीक होने के लिए, 'डूगेट()' को संभालने वाला थ्रेड, विधियों के पूरे ढेर को समाप्त होने के बाद उपलब्ध होगा (विधि जो विधि को कॉल करती है ...... जो 'doGet() को कॉल करने वाली विधि को कॉल करती है ')। –

+0

हां, यही मेरा मतलब है – user454322

2

कई API-s समर्थन COMET (लंबे समय तक रहने वाले HTTP अनुरोध, जहां कोई थ्रेड/अनुरोध समस्या नहीं है) प्रोग्रामिंग हैं। इसलिए थ्रेड/अनुरोध से बचने के लिए सर्वलेट 3 एपीआई का उपयोग करने की कोई सख्त आवश्यकता नहीं है। एक Grizzly इंजन है जो ग्लासफ़िश 2.11 (example) में चल रहा है। दूसरा समाधान Jetty Continuation है। तीसरा Servlet 3 API. है।

मूल अवधारणा यह है कि अनुरोध कुछ कंटेनर प्रबंधित एसिंक्रोनस हैंडलर बनाता है जिसमें अनुरोध किसी ऑब्जेक्ट द्वारा पहचाने गए किसी ईवेंट (उदाहरण के लिए क्लाइंट स्ट्रिंग) की सदस्यता ले सकता है। फिर एसिंक्रोनस प्रसंस्करण धागा एक बार हैंडलर से कह सकता है कि घटना होती है, और अनुरोध जारी रखने के लिए धागा मिलता है। यह आपके द्वारा उपयोग किए जा सकने वाले एपीआई पर आपके चुने हुए एप्लिकेशन सर्वर पर पूरी तरह निर्भर करता है। आपकी पसंद कौन सा है?

+0

किसी को ध्यान रखना चाहिए कि ग्रिज़ली और जेट्टी प्रत्येक को अपने स्वयं के कामकाज के माध्यम से इसे पूरा करते हैं, जबकि सर्वलेट 3.0 मानक का अर्थ है कि इस तरह के गैर पोर्टेबल (विभिन्न अनुप्रयोग सर्वरों में) समाधान अब आवश्यक नहीं होंगे।स्वाभाविक रूप से, ग्रिज़ली और जेट्टी दोनों (या जा रहे हैं) Servlet 3.0 को लागू करते हैं, एक कल्पना करेगा। तो, यह तीनों के बीच चयन करने की बात नहीं है, बल्कि तीसरे को लागू करने वाले दो में से कौन सा चुनना है, आपको पसंद है। – user359996

2

सर्वलेट कंटेनर में अपने स्वयं के धागे बनाना समस्या के लिए पूछ रहा है। (ऐसे मामले हो सकते हैं जहां आपको यह करना है, लेकिन यदि आपके पास कुछ ढांचा है जो आपके लिए धागे का प्रबंधन करता है, तो आपको इसका उपयोग करना चाहिए।)

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