2011-02-16 14 views
8

मैं कस्टम जावा डिमन में टीईआरएम, एबीआरटी और आईएनटी संकेतों को पकड़ने के लिए एक कस्टम सिग्नल हैंडलर का उपयोग कर रहा हूं। मेरे पास कोड में यह हैंडलर है ताकि मैं इसे टीईआरएम सिग्नल भेज सकूं और हत्या आदेश के माध्यम से कार्यक्रम को बंद कर दूं। संकेत हैंडलर अभी से काम करता है, लेकिन मैं निम्न चेतावनी (कई बार से अधिक) प्राप्त कर रहा हूँ जब मैं कोड संकलन:चलने वाले संकेतों को सिग्नल भेजना JVM

चेतावनी: sun.misc.SignalHandler सूर्य मालिकाना एपीआई है और एक भविष्य में हटाया जा सकता है जारी

इन कक्षाओं का उपयोग करते समय:

import sun.misc.SignalHandler; 
import sun.misc.Signal; 

वहाँ एक चल JVM को संकेत भेजने के लिए मुख्य थ्रेड के एक बंद आरंभ करने के लिए एक बेहतर तरीका है? मुझे यह एपीआई से जुड़ा हुआ कोड पसंद नहीं है जब इसे भविष्य में हटाया जा सकता है।

यह कोड आज 1.5.0_22 जेवीएम का उपयोग कर सोलारिस और एचपीयूएक्स पर काम करता है। किसी भी मदद या सुझाव की सराहना की जाएगी। मैं आईबीएम से इस दस्तावेज़ का इस्तेमाल किया,, संकेत हैंडलर विकसित करने के लिए:

http://www.ibm.com/developerworks/java/library/i-signalhandling/

+1

गौर करने के रूप में मैं जानता हूँ कि वहाँ संकेत से निपटने के लिए कोई सार्वजनिक एपीआई (शायद, क्योंकि यह बहुत ओएस विशिष्ट है) है, तो आप इस चेतावनी के साथ प्रस्तुत करना होगा चाहते हैं। – biziclop

उत्तर

17

सबसे पहले, समझें कि यह सूर्य.मिस्क पैकेज के लिए केवल एक मानक चेतावनी है। वे आपको बता रहे हैं कि आप जिस एपीआई का उपयोग कर रहे हैं वह एक मानक जावा एपीआई नहीं है। इसका मतलब यह नहीं है कि वे सक्रिय रूप से भविष्य में इस एपीआई को हटाने की योजना बना रहे हैं। http://java.sun.com/products/jdk/faq/faq-sun-packages.html

जहां तक ​​आपका प्रश्न है, यह मेरे लिए बिल्कुल स्पष्ट नहीं है कि क्यों डिफ़ॉल्ट प्रक्रिया जावा प्रक्रिया संभालती है सिग्नल आपके लिए पर्याप्त नहीं है: How to stop java process gracefully?। यदि आपको अतिरिक्त तर्क जोड़ने की आवश्यकता है, तो आप shutdown hook जोड़ सकते हैं।

फिर भी, आप अपने जावा प्रक्रिया बताने के लिए पता है कि यह बाहर निकलने के लिए समय आ गया है अन्य तरीकों की तलाश कर रहे हैं, तो आप यह एक सॉकेट, या stdin, या एक नामित पाइप पर सुनने हो सकता है ...

आप हो सकता है भी जहाँ तक JVMTI

+0

आपका "जावा प्रक्रिया को कैसे रोकें" बहुत उपयोगी था। मैंने एक खोज की और मुझे यकीन नहीं है कि मैं उसे कैसे याद करता हूं। मैंने अपनी लिपि को देखा जो मारता है और यह "मार -9" कर रहा है। मुझे लगता है कि मैं उस लिंक के अनुसार गलत सिग्नल भेज रहा हूं, और ऐप को कड़ी मेहनत कर रहा हूं (यही कारण है कि मुझे सुंदर निकास के लिए शटडाउन के दौरान संकेत को फंसाना पड़ा)। मैं एक अलग संकेत, और शटडाउन हुक कोशिश करने जा रहा हूं, और देखें कि यह एक बेहतर समाधान है या नहीं। – jmq

+3

यह अंततः काम करता था और मैं परियोजना से उन दो वर्गों को हटाने में सक्षम था। आपका सुझाव उपयोगी था, धन्यवाद। – jmq

+0

इसे सुनकर खुशी हुई। – ykaganovich

3

आप JMX के माध्यम से ऐसा कर सकता है। जेएमएक्स एपिस का एक मानक सेट है जिसका प्रयोग जावा अनुप्रयोगों की निगरानी और प्रबंधन के लिए किया जा सकता है।

ये कुछ लिंक प्राप्त करने के लिए आप शुरू कर रहे हैं:

http://onjava.com/pub/a/onjava/2004/09/29/tigerjmx.html

http://www.ibm.com/developerworks/java/library/j-jtp09196/index.html?ca=drs

मुख्य विचार यह है:

क) आप एक बूलियन चर होगा, isShutDownTrigerred का कहना है। आपके पास एक थ्रेड होगा जो एक अनंत लूप चलाएगा, 2 एस के लिए सोएगा, और इस चर मूल्य को जांचता रहता है। जब मान सत्य होता है, तो आप उस कोड को निष्पादित करेंगे जो एप्लिकेशन को बंद कर देगा।

बी) फिर आप एक एमएक्सबीन लिखते हैं (उपरोक्त लिंक देखें)। यह एमएक्सबीन "isShutDownTrigerred" मान को सही करने के लिए उपयोग किया जाएगा। जावा एप्लिकेशन के एमएक्सबीन को देखने और संशोधित करने के लिए आप jconsole/jManage जैसे टूल का उपयोग कर सकते हैं। जैसे ही "isShutDownTriggered" सत्य पर सेट किया गया है, उपर्युक्त धागा इसे जानने जा रहा है और एप्लिकेशन के शटडाउन को निष्पादित करेगा

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