2013-08-26 11 views
7

के दौरान सर्वलेट अनुरोधों को कैसे संसाधित करें हमें अपने सर्वलेट एप्लिकेशन में एक सुंदर शटडाउन तंत्र को लागू करने की आवश्यकता है।लंबे शटडाउन

संपादित करें: हम इसे यथासंभव सरल बनाना चाहते हैं, जो ऑपरेटिंग सिस्टम के फ़ंक्शन के माध्यम से भेजे गए एक हत्या संकेत को संभालेगा। यह सिस्टम प्रशासकों को खोल उपयोगिताओं (विंडोज़ पर मार या टास्किल) में निर्मित करने की अनुमति देगा, अन्यथा उन्हें सर्वर के साथ "बात करने" के लिए एक और उपयोगिता स्थापित करनी होगी।

इस तंत्र को दो चरणों में काम करता है:

    बंद अनुरोध पर
  1. , इनकार कुछ महत्वपूर्ण गतिविधियों
  2. ब्लॉक पहले से शुरू की महत्वपूर्ण कार्यों पूरा कर रहे हैं जब तक; इनमें कई घंटे लग सकते हैं

चरण # 1 हमारी डीएओ परत में लागू किया गया है। चरण # 2 हमारे ServletContextListener # संदर्भ में कार्यान्वित किया गया है Destroyed विधि

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

संपादित करें: संदर्भ डीस्ट्रायर्ड कहा जाता है जब कोई सर्वर की प्रक्रिया पर ऑपरेटिंग सिस्टम के हत्या कार्य को बुला रहा है।

हम चरण # 2 के दौरान एप्लिकेशन को जीवित रहने देना चाहते हैं, जो उपयोगकर्ताओं को सूचित करते हैं कि कुछ गतिविधियां अनुपलब्ध हैं।

+0

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

+0

कुछ गतिविधियां यूआई कार्यों द्वारा शुरू की जाती हैं और कुछ शेड्यूलर द्वारा शुरू की जाती हैं - यही कारण है कि मैं उन्हें डीएओ परत पर नियंत्रित करने के बारे में सोच रहा हूं। –

उत्तर

4

सभी महत्वपूर्ण अनुरोधों की सूची रखने के लिए filter का उपयोग करें।

जब "तैयार शट डाउन" अनुरोध प्राप्त होता है, तो फ़िल्टर को कुछ अनुरोधों को अस्वीकार करना शुरू करना चाहिए।

एक सर्वलेट लिखें जो आपको बताता है कि कतार में कितनी महत्वपूर्ण नौकरियां बाकी हैं।

शटडाउन टूल में, "शटडाउन तैयार करें" भेजें। महत्वपूर्ण नौकरियों की संख्या के लिए सर्वलेट मतदान। जब यह 0 तक पहुंच जाता है, तो वास्तविक शट डाउन कमांड भेजें।

ऐसा करने के लिए, व्यवसाय परत में एक सेवा बनाएं जो इसे व्यवस्थित करती है। ध्यान दें कि contextDestroyed() से पहले सब कुछ होना चाहिए! आपका विशेष एप्लिकेशन शट डाउन दुनिया के जे 2 ईई व्यू में फिट नहीं है, इसलिए आपको इसे स्वयं प्रबंधित करना होगा।

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

जब सभी नौकरियां पूरी की जाती हैं, तो "शटडाउन जानकारी" सर्वलेट तक पहुंच को छोड़कर सभी अनुरोधों को अस्वीकार कर दें, जो तब बताएं कि ऐप अब मौत के लिए तैयार है।

एक उपकरण लिखें जो प्रशासक को आपके ऐप के शट डाउन को शुरू करने के लिए एक अच्छा यूआई देता है।

[संपादित करें] आप ओएस को अपने आवेदन को बंद करने से रोकने के लिए प्रेरित महसूस कर सकते हैं। ऐसा मत करो।

आपको क्या करना चाहिए, ऊपर वर्णित दो चरण प्रक्रिया का उपयोग करके अपना आवेदन बंद करने के लिए एक विशेष उपकरण लिखना है। यह बंद करने का मानक तरीका होना चाहिए।

हां, प्रशासक इसके बारे में शिकायत करेंगे। यूनिक्स पर, आप इस टूल को इनिट स्क्रिप्ट में डालकर छुपा सकते हैं, इसलिए कोई भी नोटिस नहीं करेगा। विंडोज पर एक समान समाधान हो सकता है।

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

+0

कुछ गतिविधियां यूआई कार्यों द्वारा शुरू की जाती हैं और कुछ शेड्यूलर द्वारा शुरू की जाती हैं। एक फ़िल्टर शेड्यूलर द्वारा शुरू की गई कार्रवाइयों के साथ काम नहीं करेगा। –

+0

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

+0

इससे प्रेजेंटेशन परत के बारे में व्यवसाय तर्क परत "पता" हो जाएगी, है ना? –

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