जावा ईई कंटेनर में थ्रेडिंग थ्रेड्स को हतोत्साहित क्यों किया जाता है?


120

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

क्या आप स्पष्ट रूप से बता सकते हैं कि यह हतोत्साहित क्यों है?

मुझे यकीन है कि अधिकांश उद्यम अनुप्रयोगों को किसी प्रकार की अतुल्यकालिक नौकरियों की आवश्यकता होती है जैसे मेल डेमॉन, निष्क्रिय सत्र, सफाई नौकरियां आदि।

इसलिए, यदि वास्तव में किसी को थ्रेड्स नहीं फैलाने चाहिए, तो जरूरत पड़ने पर इसे करने का सही तरीका क्या है?


4
एसिंक्रोनस कार्यों को आमतौर पर जेएमएस मैसेजिंग और एमडीबी का उपयोग करके किया जाता है।
केन लियू

5
जेएसआर 236 कंटेनरों में लागू होने के बाद यह मुद्दा जल्द ही अतीत की बात होनी चाहिए ।
letmaik

5
यह हतोत्साहित किया गया था क्योंकि किसी भी दूसरे धागे को कंटेनर द्वारा बनाया और प्रबंधित किया जाना चाहिए, ताकि धागे को अन्य उद्यम संसाधनों तक पहुंच प्राप्त हो। जावा ईई 7 के साथ, उद्यम वातावरण में धागे बनाने के लिए एक मानक और सही तरीका है। Concurrency Utils का उपयोग करके, आप यह सुनिश्चित करते हैं कि आपका नया धागा बनाया गया है, और कंटेनर द्वारा प्रबंधित किया जाता है, यह गारंटी देता है कि सभी EE सेवाएँ उपलब्ध हैं। यहाँ
क्रिस रिची

JSF / EJB परिप्रेक्ष्य में कई सही तरीके यहां
देखे

जवाबों:


84

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

इसे "सही ढंग से" करने के तरीके हैं, लेकिन यह इस्तेमाल किए जा रहे प्लेटफॉर्म पर निर्भर है।

WebSphere और WebLogic के साथ-साथ अन्य के लिए भी सामान्य WorkManager आम है

अधिक जानकारी यहाँ

और यहाँ

इसके अलावा कुछ इस सुबह से एक डुप्लिकेट

अद्यतन: कृपया ध्यान दें कि यह प्रश्न और उत्तर 2009 में जावा ईई की स्थिति से संबंधित है, तब से चीजें बेहतर हुई हैं!


1
आप एक InitialContext नहीं प्राप्त कर सकते हैं और JNDI लुकअप को अन्य सिस्टम संसाधनों जैसे JMS कनेक्शन फैक्ट्रीज़ और डेटा स्रोत तक पहुँचने के लिए करते हैं। मेरे पास एक ऐप है जो थ्रेड शुरू करते समय डेटा स्रोत को इंजेक्ट करके इसके चारों ओर काम करता है, लेकिन मुझे इस दृष्टिकोण पर पुनर्विचार करना पड़ सकता है ...
rjohnston

6
कोर जावा ईई एपीआई के साथ धागे बनाने के लिए अब एक मानक और सही तरीका है। Concurrency Utils का उपयोग करके, आप यह सुनिश्चित करते हैं कि आपका नया धागा बनाया गया है, और कंटेनर द्वारा प्रबंधित किया जाता है, यह गारंटी देता है कि सभी EE सेवाएँ उपलब्ध हैं। यहाँ और यहाँ के
क्रिस रिची

@ChrisRitchie टिप के लिए धन्यवाद। अगर केवल JBoss के रूप में / आईबीएम समर्थित किया गया जावा ईई 7 ... :-(
asgs

1
@asgs WildFly 8 (JBoss AS का नया नाम) Java EE को सपोर्ट करता है। IBM केवल Java EE 6 सर्टिफाइड सर्टिफिकेशन है
क्रिस रिची

34

EJBs के लिए, यह न केवल हतोत्साहित है, यह स्पष्ट रूप से विनिर्देश द्वारा निषिद्ध है :

एक उद्यम बीन को कई उदाहरणों के निष्पादन को सिंक्रनाइज़ करने के लिए थ्रेड सिंक्रोनाइज़ेशन प्राइमेटिव का उपयोग नहीं करना चाहिए।

तथा

एंटरप्राइज़ बीन को थ्रेड्स प्रबंधित करने का प्रयास नहीं करना चाहिए। एंटरप्राइज़ बीन को एक थ्रेड को शुरू करने, रोकने, निलंबित करने या फिर से शुरू करने या किसी थ्रेड की प्राथमिकता या नाम को बदलने का प्रयास नहीं करना चाहिए। एंटरप्राइज़ बीन को थ्रेड समूहों को प्रबंधित करने का प्रयास नहीं करना चाहिए।

कारण यह है कि ईजेबी वितरित वातावरण में काम करने के लिए हैं। एक EJB को क्लस्टर में एक मशीन से दूसरे में ले जाया जा सकता है। थ्रेड्स (और सॉकेट्स और अन्य प्रतिबंधित सुविधाएं) इस पोर्टेबिलिटी के लिए एक महत्वपूर्ण बाधा हैं।


3
जावा ईई 7 कंसीलर यूटिल्स एक उद्यम वातावरण में धागे बनाने का एक सही तरीका प्रदान करते हैं। यहाँ और यहाँ के
क्रिस रिची

1
@ क्या आप मुझे समझा सकते हैं कि एक थ्रेटर में एक मशीन से दूसरी मशीन में EJB को ले जाने की पोर्टेबिलिटी के लिए एक थ्रेड क्यों महत्वपूर्ण होगा?
गीक

13

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

यही कारण है कि J2EE से 1.4 टाइमर सेवाओं को पेश किया गया था। देखें इस जानकारी के लिए लेख।


2
JSR 236 ने जावा ईई 7 और बाद में स्प्रेडिंग थ्रेड्स का समर्थन करने के लिए सुविधाओं को जोड़ा। देखिये क्रिस रिची का यह जवाब
बेसिल बोर्के

8

जावा ईई के लिए कंसीडर यूटिलिटीज

कोर जावा ईई एपीआई के साथ धागे बनाने के लिए अब एक मानक और सही तरीका है:

Concurrency Utils का उपयोग करके, आप यह सुनिश्चित करते हैं कि आपका नया धागा बनाया गया है, और कंटेनर द्वारा प्रबंधित किया जाता है, यह गारंटी देते हुए कि सभी EE सेवाएँ उपलब्ध हैं।

उदाहरण यहाँ


2

आप कंटेनर को हमेशा अपनी तैनाती के वर्णनकर्ताओं के हिस्से के रूप में सामान शुरू करने के लिए कह सकते हैं। फिर आपको जो भी रखरखाव कार्य करने की आवश्यकता होती है, वे कर सकते हैं।

नियम का पालन करो। आपको खुशी होगी किसी दिन आपने :)


2

ब्लूप्रिंट के अनुसार जावा ईई कंटेनर में थ्रेड्स निषिद्ध हैं। कृपया अधिक जानकारी के लिए ब्लूप्रिंट देखें।


2

ऐसा न करने का कोई वास्तविक कारण नहीं है। मैंने समस्याओं के बिना एक वेब में स्प्रिंग के साथ क्वार्ज़ का उपयोग किया । साथ ही समवर्ती रूपरेखा का उपयोग किया जा सकता है। आप अपने खुद के धागे प्रबंधन लागू हैं, करने के लिए theads सेट deamon या उनके लिए एक स्वयं deamon धागा समूह उपयोग करती हैं इसलिए कंटेनर अपने webapp किसी भी समय अनलोड कर सकते हैं।java.util.concurrent

लेकिन सावधान रहें, बीन स्कोप्स सत्र और अनुरोध थ्रेड्स में काम नहीं करते हैं! इसके अलावा अन्य कोड ThreadLocalबॉक्स से बाहर काम नहीं करता है, आपको मूल्यों को स्वयं द्वारा थ्रेडेड थ्रेड्स में स्थानांतरित करने की आवश्यकता है।


1

मैंने कभी नहीं पढ़ा कि यह हतोत्साहित करता है, इस तथ्य को छोड़कर कि इसे सही तरीके से करना आसान नहीं है।

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


7
यह वास्तव में कल्पना द्वारा निषिद्ध है।
केन लियू

1

एक कारण है कि मैंने पाया है कि अगर आप ईजेबी में कुछ धागे डालते हैं और फिर आप कंटेनर को उतारने की कोशिश करते हैं या अपने ईजेबी को अपडेट करते हैं तो आप समस्याओं में भाग लेंगे। कुछ करने के लिए लगभग हमेशा एक और तरीका है जहां आपको थ्रेड की आवश्यकता नहीं होती है, इसलिए केवल NO नहीं कहें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.