Das senden von Signalen zu einer Laufenden JVM
Ich bin mit einem benutzerdefinierten signal-handler catch-BEGRIFF, ABRT-und INT-Signale in einem benutzerdefinierten java-daemon. Ich habe diese Prozedur in den code, so dass ich senden kann LANGFRISTIGE Signale und anmutig Herunterfahren das Programm über den kill-Befehl. Der signal-handler jetzt funktioniert, aber wenn ich kompilieren Sie den code, ich erhalte folgende Warnung (um ein Vielfaches):
Warnung: die Sonne.misc.SignalHandler Sun proprietary API and may be removed in a future release
während der Verwendung dieser Klassen:
import sun.misc.SignalHandler;
import sun.misc.Signal;
Gibt es einen besseren Weg, um Signale an einen Laufenden JVM zu initiieren, die eine Abschaltung der Haupt-thread? Ich mag es nicht meinen code gebunden, um diese API, wenn es entfernt werden könnte in der Zukunft.
Dieser code funktioniert auf Solaris-und HPUX-heute mit 1.5.0_22 JVM. Jede Hilfe oder Anregungen wäre sehr geschätzt werden. Ich habe dieses Dokument von IBM, zu entwickeln, der signal-handler:
http://www.ibm.com/developerworks/java/library/i-signalhandling/
- Soweit ich weiß, gibt es keine öffentliche API für signal-handling (wahrscheinlich, weil es auch OS-spezifische), so müssen Sie oben zu setzen mit dieser Warnung.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Zunächst verstehen, dass dies nur eine standard-Warnung für die Sonne.misc-Paket. Sie lassen Sie wissen, dass die API, die Sie verwenden ist nicht ein standard-Java-API. Es bedeutet nicht, dass Sie aktiv planen zu entfernen, diese API in der Zukunft. http://java.sun.com/products/jdk/faq/faq-sun-packages.html
So weit wie Ihre Frage, es ist nicht ganz klar für mich, warum der Standard-Art java-Prozess behandelt kill-Signale ist nicht ausreichend für Sie: How to stop java-Prozess, der anmutig?. Wenn Sie brauchen, um zusätzliche Logik, können Sie ein shutdown-hook.
Immer noch, Wenn Sie auf der Suche nach anderen Möglichkeiten, lassen Sie Ihre java-Prozess, der weiß, es ist Zeit zu beenden, können Sie es, hören Sie auf einen sockel, oder stdin, oder eine named-pipe...
Möchten Sie vielleicht auch einen Blick in JVMTI
Könnte man dies über JMX.
JMX ist ein standard-set von apis, die verwendet werden können zur überwachung und Verwaltung von java-Anwendungen.
Hier sind einige links zum Einstieg :
http://onjava.com/pub/a/onjava/2004/09/29/tigerjmx.html
http://www.ibm.com/developerworks/java/library/j-jtp09196/index.html?ca=drs
Die Grundidee ist diese :
a) haben Sie eine Boolesche variable, sagen isShutDownTrigerred. Haben Sie einen thread, der ausgeführt wird eine endlos-Schleife, schlafen, 2s, und hält der überprüfung dieser variable Wert. Wenn der Wert true ist, wird code ausgeführt wird, beenden Sie die Anwendung.
b) Dann schreiben Sie ein mxbean (überprüfen Sie die links oben). Diese mxbean wird benutzt, um den "isShutDownTrigerred" - Wert auf true. Sie können verwenden Sie ein tool wie jconsole /jManage, um zu sehen und ändern Sie die mxbeans einer java-Anwendung. Sobald die "isShutDownTriggered" auf true gesetzt ist, wird der thread oben ist, wissen Sie es und führen Sie das Herunterfahren der Anwendung