2012-02-03 12 views
5

जब एक जेवीएम-रन (वास्तव में स्कैला में लिखा गया था, लेकिन मुझे विश्वास है कि समाधान ग्रोवी, क्लोजर या शुद्ध जावा के लिए काफी समान होगा) मेरा कंसोल प्रोग्राम Ctrl दबाकर उपयोगकर्ता द्वारा समाप्त हो जाता है + सी (या सिस्टम शट-डाउन अनुक्रम द्वारा, मुझे नहीं पता कि किसी प्रोग्राम के लिए कोई अंतर है या नहीं), मैं यह सुनिश्चित कैसे कर सकता हूं कि बाहरी संसाधनों को एप्लिकेशन संशोधित करता है (डेटाबेस, फ़ाइलें, वेब सेवा सारित संसाधन) एक अनुमानित, गैर-तर्कसंगत भ्रष्ट राज्य में छोड़े गए हैं?जेवी कंसोल अनुप्रयोगों में^सी से कैसे निपटें?

उत्तर

7

Runtime.addShutdownHook पर एक नज़र डालें।

आप आमतौर पर यह के रूप में तो प्रयोग करेंगे:

Runtime.addShutdownHook(new Thread() { 
    public void run() { 
     // do your clean up here. 
    } 
}); 
3

आप इस सिग्नल को फंस सकते हैं और संसाधन बंद कर सकते हैं। ज्यादातर सेवाओं को बंद करने की आवश्यकता नहीं होती है, हालांकि आमतौर पर आपके द्वारा लिखी जाने वाली फाइलें होती हैं।

यह संभव है कि आपको शटडाउन हुक जोड़ना संभव हो। लेकिन मैं आपकी स्थिति के लिए इसका परीक्षण करूंगा।

10

आप लेकिन एक बंद हुक को लागू करने के रूप में दूसरों बताया कोशिश कर सकते हैं:

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

मुझे लगता है कि आपको अपने आवेदन में लेनदेन संबंधी संदर्भ पेश करना होगा। डेटाबेस के लिए जो काफी आसान है, फाइल सिस्टम के लिए आप Apache Commons Transaction

+0

+1 ब्लैकआउट और सिस्टम क्रैश के खिलाफ प्रोग्राम को सुरक्षित करने का एकमात्र तरीका भी देख सकते हैं। – josefx

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