2011-09-16 10 views
6

से अपवाद को पकड़ना मैंने उस समस्या में भाग लिया है जहां मेरे पास कोई प्रोग्राम है (मेरे द्वारा लिखित नहीं, किसी और द्वारा) मैं 24/7 चलाने के लिए चाहता हूं, लेकिन कभी-कभी यह क्रैश हो जाता है। आम तौर पर, यह कोई मुद्दा नहीं होगा क्योंकि मैं केवल एक प्रक्रिया वॉचर बना सकता हूं जो जांचता है कि यह क्रैश हो गया है, और फिर आवश्यक होने पर इसे पुनरारंभ करता है।किसी अन्य चल रहे जावा एप्लिकेशन

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

क्या कोई तरीका है कि मैं इस प्रक्रिया से इस जानकारी को रोक सकता हूं?

+0

आप किस ओएस का उपयोग कर रहे हैं? – Windle

+0

क्या आपके पास इस ऐप के स्रोत कोड तक पहुंच है? और यदि हां - क्या आप इसे संशोधित कर सकते हैं? – aav

+0

@ विंडल: यह विंडोज 7 पर चल रहा है, लेकिन मैं इसे आसानी से लिनक्स में भी चला सकता हूं। हालांकि मैं विंडोज के लिए एक समाधान पसंद करेंगे। –

उत्तर

4

आप Java Virtual Machine Tools Interface का उपयोग करना चाहते हैं। मैं आपको अपवाद पकड़ने के लिए कोड नहीं दे सकता, लेकिन यह कहां देखना है। आप वर्ग कि अपवाद फेंकता है खोजने के लिए कुछ जासूसी काम करना होगा, या कम से कम कुछ संकेत है कि यह निकाल दिया गया है खोजने के लिए।

संपादित करें: आप भी विक्रेता बुला अगर वे एक तरीका पता देखने के लिए कोशिश कर सकते हैं। आप यह भी देखने के लिए देख सकते हैं कि यह लॉग फ़ाइल के अपवाद को लिख रहा है, जिसे आप देख सकते हैं।

+0

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

1

क्या अन्य प्रोग्राम जावा है? AspectJ पर देखें, यदि आप प्रोग्राम स्टार्टअप पर नियंत्रण रखते हैं तो आप इसका उपयोग कर कुछ हैक कर सकते हैं।

+0

मेरे पास एकमात्र नियंत्रण एक निष्पादन योग्य फ़ाइल है जिसे मैं चला सकता हूं। क्या यह अभी भी संभव होगा? –

+1

AspectJ केवल जावा पर काम करता है। यदि यह विंडोज एक्जिक्यूटिव है तो आपको शायद विंडो शीर्षक के लिए एक लुक-आउट रखना होगा और फिर प्रक्रिया को पुनरारंभ करना होगा। –

+0

मैं चाहता था, लेकिन यह इस तरह से काम नहीं करता है। यह इंटरफ़ेस में टेक्स्ट बॉक्स में आउटपुट करता है, शीर्षक नहीं। –

2

मुझे लगता है कि आपके पास स्रोत कोड तक पहुंच नहीं है, इसलिए यदि यह GUI को आउटपुट कर रहा है तो उत्तर नहीं है। भले ही आप चल रहे प्रक्रिया से जुड़ सकें, आपको अपवाद को अवरुद्ध करने की आवश्यकता होगी, लेकिन यह पकड़ा जाता है और जीयूआई को भेजा जाता है, जो आवेदन से नहीं फेंक दिया जाता है।

सिद्धांत रूप में, आप एप्लिकेशन को स्क्रैप कर सकते हैं। मुझे ऐसा करने के लिए किसी भी विशिष्ट उपकरण के बारे में पता नहीं है, लेकिन वे वहां से बाहर हो सकते हैं।

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

संपादित करें 2: मैंने एक दूसरा, अधिक सटीक उत्तर प्रस्तुत किया। निचे देखो।

+0

मेरा अनुमान है कि यह जाने का सबसे अच्छा मार्ग है। यदि यह System.err/आउट पर प्रिंट करता है तो आप बहुत सारे आउटपुट देखने जा रहे हैं और आप प्रक्रिया को मार सकते हैं (बनाए गए जीयूआई तत्वों को हटा सकते हैं)। –

1

ऐप को पुनर्निर्माण करने की क्षमता के बिना आप आमतौर पर भाग्य से बाहर होते हैं जब तक आप कुछ व्यापक हैकिंग नहीं करते। यहां एक विकल्प है जिसे मैं सोच सकता हूं।

सबसे अधिक संभावना अनुप्रयोग की अपनी धारा कार्यान्वयन के साथ System.out और/या System.err बदल देता है। यदि ऐसा है तो आप इस स्ट्रीम के लिए कक्षा का पता लगाने की कोशिश कर सकते हैं और इसे उसी नाम से अपने स्वयं के रैपर से बदल सकते हैं। आप जर्जर का उपयोग कर मूल वर्ग का नाम बदल सकते हैं। वैपर में आप अपवाद का पता लगाने के लिए कंसोल आउटपुट प्रदान कर सकते हैं।

+0

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

2

यह या काम नहीं हो सकता है, लेकिन अगर जब आवेदन प्रदर्शित करता है यह त्रुटि है और सर्वर काम स्मृति उपयोग ड्रॉप करता है बंद हो जाता है? यदि ऐसा है तो आप शायद विंडोज़ कमांड tasklist पर कॉल करने के लिए अपनी प्रक्रिया मॉनिटर में कुछ तर्क जोड़ सकते हैं यह देखने के लिए कि मेमोरी उपयोग कुछ थ्रेसहोल्ड से नीचे गिरता है या नहीं। आपको यह जांचना होगा कि प्रोग्राम सामान्य रूप से कितनी मेमोरी का उपयोग करता है और यह त्रुटि के बाद कितना उपयोग करता है।

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

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