2012-12-06 16 views
5

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

+0

क्या आपका मतलब 'आखिरकार' खंड था? –

उत्तर

8

@thedan कठिन JVM दुर्घटनाओं के बारे में सही है एक "रक्षा की अंतिम पंक्ति" पैदा करते हैं। यदि कोई JVM कड़ी मेहनत करता है या इसे सिगकिल मिल जाता है, तो उसे बाहर निकलने से पहले कुछ भी चलाने का मौका नहीं मिलेगा। उस परिदृश्य में जावा में इसका समाधान करने के लिए आप कुछ भी नहीं कर सकते हैं। (लेकिन स्थिति अन्य भाषाओं में भी वही है ...)

हालांकि यदि JVM सिस्टम को समाप्त करने वाले सभी गैर-डेमॉन धागे के जवाब में व्यवस्थित शटडाउन करता है, तो सिस्टम.एक्सिट() को कॉल करना, सिगिनट प्राप्त करना और इसी तरह , तो JVM शट डाउन हुक चलाने का प्रयास करेगा। Q&A पृष्ठ और javadocs में जावा के शट डाउन हुक तंत्र पर अधिक जानकारी है।

finally दृष्टिकोण भी एक विकल्प है, लेकिन केवल तभी काम करता है जब प्रश्न में धागा JVM से बाहर निकलता है। यह तब नहीं होगा जब System.exit() कहा जाता है या JVM को सिग्नल द्वारा समाप्त कर दिया जाता है। शटडाउन हुक अधिक परिस्थितियों में काम करते हैं।

(मेरे दिमाग में, finally वास्तव में पूरे एप्लिकेशन के बजाय एकल धागे पर साफ प्रदर्शन करने के लिए है। हालांकि यदि आपके एप्लिकेशन में केवल एक धागा होता है ... या यदि उसके पास एक मास्टर थ्रेड है जो व्यवस्थित रूप से ज़िम्मेदार है शट डाउन ... फिर finally एप्लिकेशन क्लीनअप के उद्देश्य को पूरा कर सकता है।)


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

3

यदि प्रोग्राम JVM के क्रैश के माध्यम से समाप्त हो जाता है, तो आप किसी भी चीज़ पर भरोसा नहीं कर सकते हैं।

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

2

अपवादों के लिए, आप के शरीर को try/catch/block में लपेट सकते हैं। SIGTERM सिग्नल को संभालने के लिए, आप add a shutdown hook कर सकते हैं। हालांकि, शटडाउन हुक SIGKILL जैसे सिग्नल के लिए ट्रिगर होने की गारंटी नहीं है।

Java doc से:

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

1

आप कभी Sytem.exit() को कॉल करके इसे प्राप्त नहीं करते हैं। मुख्य में() आपके साथ

try { 
    startApp(); 
} catch (Exception ex) { 
     // do some logging 
} finally { 
    releaseLicense(); 
} 
संबंधित मुद्दे

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