2012-11-18 9 views
14

लिंक http://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20 लिंक के अनुसार, नष्ट विधि को कॉल करने का कारण है जब सर्वलेट को लंबे समय से में कोई अनुरोध नहीं मिला है।कॉलिंग सर्वलेट की विध्वंस विधि

मैं सोच रहा था कि कुछ ऐसे पृष्ठ हो सकते हैं जिन्हें लंबे समय तक नहीं बुलाया जाता है। तो, क्या इसका मतलब है कि विनाश को बुलाया जाएगा और अब उनका उपयोग नहीं किया जाएगा?

असल में, मुझे साक्षात्कार में इस प्रश्न से पूछा गया था और उसने मुझे बताया कि सर्वर को बंद होने पर नष्ट विधि केवल कॉल की जाएगी।

इस पर कोई मदद की सराहना करें।

+3

मुझे नहीं लगता कि यह एक सर्वलेट को मारने के लिए आप पर है। आपकी ज़िम्मेदारी नहीं होनी चाहिए, यही कारण है कि आप एक सर्वलेट कंटेनर में हैं और सर्वलेट एक प्रबंधित संसाधन है – kolossus

उत्तर

0

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

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

मैं कई मामलों के बारे में नहीं सोच सकता जहां आप Servlets को पूल करना चाहते हैं, लेकिन यह spec द्वारा अनुमति है।

3
विनिर्देश ( The Servlet Interface -> Servlet Life Cycle -> End of Service) से

:

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

विनिर्देशन नष्ट होने वाले सर्वलेट के एक विशेष उदाहरण का जिक्र कर रहा है।

तो, क्या इसका मतलब है कि विनाश को बुलाया जाएगा और अब उनका उपयोग नहीं किया जाएगा?

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

0

यह पूरी तरह से आपके द्वारा उपयोग किए जा रहे सर्वलेट कंटेनर के कार्यान्वयन पर निर्भर करता है। यदि संसाधनों को सहेजने के लिए आपका सर्वलेट कंटेनर बहुत रूढ़िवादी है, तो यह उस सर्वलेट को नष्ट कर सकता है जो लंबे समय तक सेवा में नहीं है।

सर्वलेट spec 2.5 के पृष्ठ 22 में, आप पाएंगे, "जब सर्वलेट कंटेनर निर्धारित करता है कि सेवा से सर्वलेट हटाया जाना चाहिए, तो यह सर्वलेट इंटरफ़ेस की विध्वंस विधि को कॉल करता है ताकि सर्वलेट को किसी भी संसाधन को रिलीज़ किया जा सके। किसी भी निरंतर स्थिति का उपयोग और बचत कर रहा है। उदाहरण के लिए, कंटेनर ऐसा कर सकता है जब वह स्मृति संसाधनों को संरक्षित करना चाहता है, या जब इसे बंद किया जा रहा है।"

9

AFAIK,

जावा सर्वलेट में, destroy() प्रोग्रामर द्वारा कहा जाता था, अगर यह उत्पन्न होता है, माना जाता नहीं है। लेकिन यह मार डाला जाता है। अंतर्निहित सवाल यह है कि, सर्वलेट नष्ट हो जाएगा? नहीं, यह नहीं। destroy() विधि माना जाता होगा नहीं है और एक जावा सर्वलेट को नष्ट नहीं होंगे।

जावा सर्वलेट में destroy() का अर्थ है, सामग्री के ठीक पहले जब कंटेनर सर्वलेट को नष्ट करने का फैसला करता है निष्पादित हो जाता है। लेकिन अगर आप आह्वान destroy() स्वयं को विधि बनाएं, सामग्री अभी निष्पादित हो जाती है और फिर संबंधित प्रक्रिया जारी है। इस सवाल के संबंध में, destroy() निष्पादित हो जाता है और फिर सर्वलेट प्रारंभिकता पूर्ण हो जाती है।

destroy() विधि पहले लागू की जाती है, तो सर्वलेट कंटेनर से हटा दिया जाता है और फिर अंततः कचरा इकट्ठा किया जाता है। destroy() विधि में आमतौर पर जेडीबीसी कनेक्शन जैसे किसी भी संसाधन को मुक्त करने के लिए कोड होता है जो कचरा नहीं होगा।

0

Servlet.destroy() का जावाडोक कहता है: "सर्वलेट कंटेनर द्वारा बुलाया गया एक सर्वलेट को इंगित करने के लिए कि सर्वलेट सेवा से बाहर निकाला जा रहा है"। यह निर्दिष्ट नहीं करता है कि कौन सी परिस्थितियों में सर्वलेट को "सेवा से बाहर निकाला जा सकता है", यह केवल एक ऐसी घटना है जिसके लिए आपको प्रतिक्रिया हो सकती है। उदाहरण के लिए आप अपने द्वारा खोले गए कुछ संसाधनों को बंद करना चाहते हैं, या कुछ राज्य को भंडारण में जारी रखना चाहते हैं।

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

3

युगल:

  1. जब कंटेनर बंद हो जाता है या आवेदन बंद हो जाता है;
  2. जब कंटेनर निर्णय लेता है कि स्मृति की कमी है;
  3. जब इस सर्वलेट को लंबे समय से अनुरोध नहीं मिला है।

डॉक्टर

सर्वलेट कंटेनर द्वारा कहा जाता है एक सर्वलेट कि सर्वलेट सेवा से बाहर ले जाया जा रहा है इंगित करने के लिए अनुसार। इस विधि को केवल कहा जाता है, सर्वलेट की सेवा विधि के भीतर सभी धागे निकल चुके हैं या टाइमआउट अवधि बीत चुके हैं। सर्वलेट कंटेनर के बाद यह विधि कॉल करता है, यह इस सर्वलेट पर सेवा विधि को फिर से कॉल नहीं करेगा।

0

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

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