2009-02-10 11 views
108

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

क्या आप स्पष्ट रूप से समझा सकते हैं कि यह क्यों निराश है?

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

तो की जरूरत है वास्तव में एक धागे अंडे नहीं करना चाहिए कर रहा हूँ, क्या यह करने के लिए सही तरीका क्या है जब जरूरत?

+4

अतुल्यकालिक कार्य आमतौर पर JMS संदेश और एमडीबी का उपयोग किया जाता है। –

+5

यह समस्या जल्द ही अतीत की बात होनी चाहिए [जेएसआर 236] (http://jcp.org/en/jsr/detail?id=236) कंटेनर में लागू किया गया है। – letmaik

+4

यह _was_ निराश है क्योंकि किसी भी दूसरे थ्रेड को कंटेनर द्वारा बनाया और प्रबंधित किया जाना चाहिए, ताकि धागे को अन्य एंटरप्राइज़ संसाधनों तक पहुंच प्राप्त हो। जावा ईई 7 के साथ, एंटरप्राइज़ वातावरण में धागे बनाने के लिए एक मानक और सही तरीका है। Concurrency उपयोग का उपयोग करके, आप सुनिश्चित करते हैं कि आपका नया धागा बनाया गया है, और कंटेनर द्वारा प्रबंधित किया गया है, यह गारंटी देता है कि सभी ईई सेवाएं उपलब्ध हैं। उदाहरण [यहां] (http: // stackoverflow।कॉम/प्रश्न/3212255/जावा-ई-विनिर्देशन-और-बहु-थ्रेडिंग/1 9404307 # 1 9404307) –

उत्तर

79

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

इस "सही तरीके से" करने के तरीके हैं, लेकिन यह उपयोग किए जा रहे मंच पर निर्भर है।

The commonj WorkManager is common for WebSphere and WebLogic as well as others

More info here

And here

इसके अलावा कुछ हद तक आज सुबह

अद्यतन से this one डुप्लिकेट: कृपया ध्यान दें कि इस सवाल-जवाब 2009 में जावा ईई के राज्य से संबंधित हैं, बातें तब से सुधार हुआ है!

+1

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

+6

कोर जावा ईई एपीआई के साथ धागे बनाने के लिए अब एक मानक और सही तरीका है। Concurrency उपयोग का उपयोग करके, आप सुनिश्चित करते हैं कि आपका नया धागा बनाया गया है, और कंटेनर द्वारा प्रबंधित किया गया है, यह गारंटी देता है कि सभी ईई सेवाएं उपलब्ध हैं। उदाहरण [यहां] (http://blog.chris-ritchie.com/2013/09/simple-concurrency-example-with-wildfly.html) और [यहां] (http: //blog.chris-ritchie। com/2013/10/प्रबंधित-थ्रेड-फैक्ट्री-उदाहरण-इन-wildfly.html) –

+0

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

1

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

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

+7

यह है वास्तव में कल्पना द्वारा मना कर दिया। –

+0

http://java.dzone.com/articles/5-quick-points-about-threads – newday

11

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

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

+1

जेएसआर 236 ने जावा ईई 7 और बाद में स्पॉन्गिंग थ्रेड का समर्थन करने के लिए विशेषताओं को जोड़ा। देखें [क्रिस रिची द्वारा इस भाई का जवाब] (http://stackoverflow.com/a/19404453/642706)। –

2

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

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

2

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

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

0

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

32

EJBs के लिए, यह केवल हतोत्साहित नहीं है, यह स्पष्ट रूप से specification से मना किया है:

एक उद्यम सेम कई उदाहरणों में से सिंक्रनाइज़ निष्पादन के लिए धागा तुल्यकालन पुरातन उपयोग नहीं करना चाहिए।

और

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

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

+3

जावा ईई 7 कंसुरेंसी उपयोग एंटरप्राइज़ वातावरण में धागे बनाने का एक सही तरीका प्रदान करते हैं। उदाहरण [यहां] (http: // blog.chris-ritchie.com/2013/09/simple-concurrency-example-with-wildfly.html) और [यहां] (http://blog.chris-ritchie.com/2013/10/managed-thread-factory -example-in-wildfly.html) –

+1

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

2

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

5

कन्करेंसी उपयोगिताएँ के लिए जावा ईई

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

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

उदाहरण here

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