2012-04-26 7 views
5

में एक नया धागा शुरू कर यह एक अच्छा विचार है कि सर्वलेट में एक नया धागा new Thread(r).start() का उपयोग कर उस डेटा का एक और टुकड़ा है कि फाइल कि था के साथ आया था संभाल लेंगे शुरू करने के लिए है अपलोड की गई। मैं इसे समान रूप से दोनों नौकरियों को संभालने के लिए चाहता था।, एक अनुरोध एक सर्वलेट कि फ़ाइलों को अपलोड करना संभालती तक पहुँच जाता है सर्वलेट

+0

मैं इसके खिलाफ हतोत्साहित होगा, जब तक कि आप थ्रेड पूलिंग का उपयोग न करें। वैकल्पिक रूप से, सर्वलेट 3 में अब एसिंक्रोनस सर्विस कॉल है, क्यों नहीं पता? –

+0

आप किस ऐप सर्वर का उपयोग कर रहे हैं? क्या यह लंबे समय तक चलने वाले कार्यों के लिए कुछ प्रकार का समर्थन प्रदान करता है? – BigMike

+0

@ बिगमाइक ग्लासफ़िश 3.1.1 – saplingPro

उत्तर

17

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

मेरा विश्वास करो, कुछ उपयोगकर्ताओं ने पहले ही अनुभव किया है: HttpServletResponse seems to periodically send prematurely

इसके अलावा यह एक बुरा विचार है कि प्रति अनुरोध नए धागे को शुरू करें क्योंकि यह तराजू खराब है (और यह कुछ विनिर्देशों से भी प्रतिबंधित है)। आप कर सकते हैं Servlet 3.0 एसिंक्रोनस अनुरोध का उपयोग करना और अपलोड को असीमित रूप से संभालना, लेकिन अधिमानतः धागे के कुछ पूल का उपयोग करना। यह भी देखें: Why create new thread with startAsync instead of doing work in servlet thread?

+0

... बुरा विचार जब तक कि आपको कुछ लंबे समय तक चलने वाले CPU-गहन कार्य करने की आवश्यकता न हो। –

+0

@Tomasz Nurkiewicz भले ही मैं उस थ्रेड के 'doPost()' विधि के अंदर नया धागा का काम रखूं? – saplingPro

+0

@ टोमाज़ नर्कविचज़ इस सर्वलेट की पोस्ट विधि के अंदर थ्रेड की रन विधि से किसी अन्य सर्वलेट को नया अनुरोध भेजने के लिए ठीक रहेगा? –

-5

Servlet (ईजेबी के विपरीत) में नया धागा शुरू करने में कुछ भी गलत नहीं है, तो हाँ, यह ठीक है।

संपादित करें: दूसरा विचार @ टोमाज़ नर्कविचज़ सही है। फ़ाइल अपलोड बंद कर दिया जाएगा।

+0

सच नहीं है, एक समवर्ती वातावरण में एक थ्रेड लिखने की आवश्यकता है। –

+0

जब तक थ्रेड किसी भी गैर-स्थानीय चर (सर्वलेट में फ़ील्ड) का उपयोग नहीं कर रहा है, तब तक कोई समस्या नहीं है। मुझे लगता है कि सबकुछ अंदर होता है गेट/डूपोस्ट विधि –

-2

सर्वलेट वेबसर्वर द्वारा नए धागे में निहित रूप से चल रहे हैं, इसलिए जब भी कोई अनुरोध सर्वलेट हिट करता है, तो इसे एक अलग थ्रेड में निष्पादित किया जाएगा। मैं खुद को एक नया धागा बनाने का कोई कारण नहीं देखता

+0

शायद क्लाइंट को फ्रीज नहीं किया जा सकता है (यदि थ्रेड समय लेने वाला है?) – BigMike

+0

तो उपयोगकर्ता को अपलोड करने के लिए सर्वलेट की प्रतीक्षा नहीं करनी है –

+0

http: //www.adam- bien.com/roller/abien/entry/are_servlets_thread_safe_and –

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