2013-07-18 9 views
15

पर सिंगलटन यदि मैं टोमकैट (या किसी अन्य सर्वर) के एक उदाहरण पर उसी एप्लिकेशन के 2 उदाहरणों को तैनात और चलाता हूं। फिर (एक सिंगलटन वर्ग के) एक वस्तु बनाया जाएगा:जेवीएम या एप्लिकेशन इंस्टेंस या टॉमकैट इंस्टेंस

  1. बिलाव का एक उदाहरण भर में (लेकिन आम 2 एक ही आवेदन की घटनाओं के लिए)
  2. या आवेदन उदाहरण के पार (आवेदन के 2 मामलों के लिए अलग)

तो अनिवार्य रूप से मैं समझना चाहता हूं कि यह हमेशा एक मामला है कि सिंगलटन वर्ग का एक ऑब्जेक्ट प्रति जेवीएम में बनाया जाता है? वेब सर्वर (या कंटेनर) पर होस्ट किए गए एप्लिकेशन के मामले में यह कैसे काम करता है।

उत्तर

23

यदि आपके पास सिंगलटन क्लास है और आप दो वेबपैप्स चलाते हैं जो इस कक्षा का उपयोग टॉमकैट में करते हैं तो दोनों वेबपैप्स को जेएमवी में टॉमकैट चलाने वाले इस सिंगलटन के 2 अलग-अलग उदाहरण मिलेंगे।

लेकिन अगर आपके webapp JRE या बिलाव साझा libs, जैसे Runtime.getRuntime से एक सिंगलटन का उपयोग करेगा webapps क्रम का एक ही उदाहरण मिल जाएगा।

ऐसा इसलिए है क्योंकि टोमकैट वेबपैस के लिए अलग-अलग वर्ग लोडर का उपयोग करता है। जब कोई वेबपैप क्लास लोडर कक्षा को लोड करता है तो यह पहले वेबपैड क्लास पथ पर खोजने की कोशिश करता है, अगर कक्षा नहीं मिली है तो यह क्लास लोड करने के लिए पैरेंट क्लास लोडर से पूछता है।

+2

@Evgenniy, क्या इसका मतलब यह है कि मेरे एकल एप्लिकेशन में मैं विभिन्न वर्ग लोडरों (बस एक विचार) का उपयोग करके 2 सिंगलटन ऑब्जेक्ट्स बना सकता हूं .?? – Learner

+1

हां, 2 क्लासलोडर बनाएं (आप URLClassLoader का उपयोग कर सकते हैं), क्लासलोडर.लोड क्लास (क्लासनाम) के साथ एक ही कक्षा लोड करें - आपको 2 अलग-अलग क्लास इंस्टेंस मिलेगा –

+0

क्या इसका मतलब सिंगलटन टूटा हुआ है? – Learner

1

<shakey-ground> जहां तक ​​मुझे पता है, एक सिंगलटन प्रति क्लासलोडर अद्वितीय है। इसलिए मुझे लगता है कि आपके प्रश्न का उत्तर कंटेनर वेब एप्लिकेशन को लोड करने के तरीके पर निर्भर करता है।

यह वेब प्रति ऐप एक classloader आवंटित करता है, तो ऐसा लगता है जैसे आप दो, पूरी तरह से स्वतंत्र, सिंगलटन वस्तुओं मिलेगा। यदि यह एक क्लासलोडर आवंटित करता है और सभी वेब ऐप्स इसका उपयोग करते हैं, तो वे एक ही सिंगलेट को एक उदाहरण साझा करते हैं। </shakey-ground>

14

एक सिंगलटन सामान्य रूप से केवल एक ClassLoader से जुड़ा हुआ है।

इसलिए यदि आप अपने .war फ़ाइल में एक .class फ़ाइल पर आधारित सिंगलटन है, और आप इस वेब आवेदन एक से अधिक बार की तैनाती, प्रत्येक आवेदन के लिए अपने स्वयं सिंगलटन हो जाता है।

दूसरी ओर, यदि आपके सिंगलटन की .class फ़ाइल tomcat के क्लासपाथ में है, तो आपके पास केवल एक उदाहरण है। यह .class किसी विशिष्ट वेब एप्लिकेशन से संबंधित नहीं है (यह tomcat उदाहरण से संबंधित है)।

आप दोनों स्थानों में सिंगलटन है, तो यह वर्ग लोडर पदानुक्रम पर निर्भर करता है, और आप संभवतः "पहले माता-पिता" "वेब अनुप्रयोग पहले" के बीच चयन कर सकते हैं या।

+0

@ बेरीलियम में चल रहे हैं, "टॉमकैट के क्लासपाथ" से आपका क्या मतलब है? मेरा मतलब है कि मैं अपनी कक्षा/जार को कहां दूंगा ताकि मुझे एप्लिकेशन में सिंगलटन मिल सके। – Vipin

+0

@vipin मैं निश्चित रूप से नहीं बता सकता, क्योंकि मैंने हाल ही में यह नहीं किया है, लेकिन एक .jar फ़ाइल को tomcat की lib/निर्देशिका में डालने का प्रयास करें। जेबॉस 7 के लिए वे प्रभावी रूप से वही करते हैं, वे इसे "मॉड्यूल" के रूप में व्यवस्थित करते हैं। – Beryllium

+0

@ बेरीलियम लंबे समय से मैंने एक लेख पढ़ा जो कहता है कि हमें अपने किसी भी जार को tomcat/lib में नहीं डालना चाहिए। हाल ही में मैंने कुछ पुनर्विक्रय किया और पाया कि हम catalina.properties के shared.loader विशेषता का उपयोग कर सकते हैं। लेकिन यकीन नहीं है कि यह काम करेगा या नहीं। – Vipin

4

यह आश्वस्त है कि आप हमेशा के लिए एक ही सिंगलटन ClassLoader क्वेरी से इस तरह के एक सिंगलटन बनाने के लिए संभव है। मैंने इस अन्य उत्तर में extensive explanation लिखा था।

1
  • टॉमकैट प्रत्येक वेब एप्लिकेशन के लिए नए क्लास लोडर बनाता है।
  • तो यदि आपकी सिंगलटन कक्षा युद्ध फ़ाइल में संग्रहीत है, तो उसी युद्ध फ़ाइल में टॉमकैट कंटेनर में दो उदाहरण होंगे। यह प्रत्येक युद्ध फ़ाइल के लिए दो अलग सिंगलटन क्लास बनाता है।
  • यदि सिंगलटन क्लास टॉमकैट के शेयर लाइब्रेरी पथ में है, तो टोमकैट दोनों एप्लिकेशन के लिए केवल एक सिंगलटन उदाहरण बनाता है।

JVM सादृश्य:

JVM बड़ा हवेली की तरह है। इसमें सेरेरल आवेदक और पुस्तकालयों के साथ संयुक्त परिवार शामिल है।

क्लासलोडर परिवार के सदस्य हैं, प्रत्येक परिवार सदस्य एक क्लासलोडर का प्रतिनिधित्व करता है (प्रतिनिधि पदानुक्रम के रूप में काम करता है विरासत पदानुक्रम नहीं)। नोट: क्लासलोडर कक्षा है, यह कई उदाहरण बना सकता है।

एप्लिकेशन उपकरण की तरह हैं। उदाहरण के लिए: वॉशिंग मशीन, फ्रिज, एयर कूलर, टेलीविजन, डाइनिंग टेबल, सोफा और इतने पर ...

पुस्तकालय प्रत्येक व्यक्ति की अपनी व्यक्तिगत लाइब्रेरी है। माता-पिता की स्वतंत्रता में हर कोई खोज नहीं पाता है तो उसे अपनी लाइब्रेरी में खोजें।

सीमाएं: यदि पिता एक उपकरण खरीदते हैं तो उनके बच्चे इसका उपयोग कर सकते हैं, लेकिन इसका उपयोग उनके माता-पिता और सिबिलिंग द्वारा नहीं किया जा सकता है। प्रत्येक एप्लिकेशन एक ही पुस्तकालय के विभिन्न संस्करणों का उपयोग कर सकता है। यानी यदि पुस्तकालय में एक ही किताब के दो या दो से अधिक संस्करण होते हैं, तो यह जो भी पुस्तक पहले उपलब्ध है उसे चुनता है।

प्रत्येक परिवार संख्या केवल एक अद्वितीय उपकरण का उपयोग कर सकती है।

घर में, हम उसी संस्करण के mulitple उपकरण का उपयोग कर सकते हैं। तो, JVM हमें समान संस्करणों के एकाधिक अनुप्रयोग चलाने की अनुमति देता है।

कचरा कलेक्टर हवेली में एक सेवा है, जो एक डिमन के रूप में घूमता है, जो किसी भी प्रकार के ऑब्जेक्ट को साफ़ कर सकता है।

एक स्थैतिक चर का दायरा प्रति क्लासलोडर तक सीमित है।

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