Tuesday, 15 January 2013

java - Clean up after servlet if init() failed -


मेरे पास Initializer वर्ग है जो ServletContextListener इंटरफ़ेस लागू करता है। इसके प्रसंग शुरूआती () विधि में, मैं कुछ वैश्विक कक्षाओं को प्रारंभ कर देता हूं जिन्हें नष्ट करना है, अन्यथा सर्वलेट को अनलोड नहीं किया जा सकता।

हालांकि, जब सर्वलेट का init () विधि एक सर्विसलेट एक्सपॉशन फेंकता है, contextDestroyed () विधि कभी नहीं बुलाती -> संसाधन नहीं रिहाई -> सर्वलेट टॉमकेट द्वारा लोड नहीं हो जाता (यह "रनिंग" स्थिति में बनी हुई है, हालांकि इसकी init विधि कभी समाप्त नहीं हुई।)

मेरा सवाल यह है - मैं इस मामले में संसाधनों को कैसे साफ़ कर सकता हूं?

बोनस: सर्विसलेट को "रनिंग" स्टेट भी क्यों मिलता है?

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

(मुझे पता है कि मैं सर्वलेट को मॉनिटर करने के लिए कस्टम कोड लिख सकता हूँ, या तो जेएमएक्स के जरिए, या नहीं, लेकिन यह इस प्रश्न के दायरे से बाहर है।)

जहां तक ​​मैं बता सकता हूँ वहाँ बिल्कुल है बाहरी अनुरोध के बिना ऐसा करने का कोई तरीका नहीं है ServletContextListener आपको सही संकेत देता है (जब सभी सर्विसलेट आरंभ किए गए हैं - सफलतापूर्वक या नहीं), लेकिन आप अपनी सर्विस का परीक्षण करने के लिए संदर्भ में सभी सर्लेटों की गणना नहीं कर सकते क्योंकि संबंधित सर्वोलेट कॉन्टैक्ट विधियों को बहिष्कृत किया गया था और अब एक खाली गणक वापस आ गया है।

संक्षेप में, ऐसा करने का एकमात्र तरीका एक गैर-मानक API के माध्यम से होता है; विशेष रूप से, यह टॉमकेट के जेएमएक्स एपीआई के साथ ऐसा करने के लिए लगभग तुच्छ है, जो कि मैं सुझाता हूं।


No comments:

Post a Comment