Senden von Signalen an eine laufende JVM

8

Ich verwende einen benutzerdefinierten Signalhandler, um TERM-, ABRT- und INT-Signale in einem benutzerdefinierten Java-Daemon abzufangen. Ich habe diesen Handler im Code, damit ich TERM-Signale an ihn senden und das Programm mit dem Befehl kill ordnungsgemäß herunterfahren kann. Der Signalhandler funktioniert gerade, aber wenn ich den Code kompiliere, erhalte ich die folgende Warnung (oft):

Warnung: sun.misc.SignalHandler ist eine proprietäre API von Sun und kann in einer zukünftigen Version entfernt werden

bei Verwendung dieser Klassen:

%Vor%

Gibt es eine bessere Möglichkeit, Signale an eine laufende JVM zu senden, um den Haupt-Thread herunterzufahren? Ich mag es nicht, wenn mein Code an diese API gebunden ist, wenn sie in Zukunft entfernt werden könnte.

Dieser Code funktioniert heute unter Solaris und HPUX mit 1.5.0_22 JVM. Jede Hilfe oder Vorschläge wären sehr willkommen. Ich habe dieses Dokument von IBM verwendet, um den Signalhandler zu entwickeln:

Ссылка

    
jmq 16.02.2011, 23:34
quelle

2 Antworten

17

Verstehen Sie zunächst, dass dies nur eine Standardwarnung für das Paket sun.misc ist. Sie teilen Ihnen mit, dass die von Ihnen verwendete API keine Standard-Java-API ist. Das bedeutet nicht, dass sie aktiv planen, diese API in Zukunft zu entfernen. Ссылка

Was Ihre Frage angeht, ist mir nicht ganz klar, warum der Standard-Java-Prozess, der Kill-Signale verarbeitet, für Sie nicht ausreicht: Wie Java-Prozess anmutig zu stoppen? . Wenn Sie zusätzliche Logik hinzufügen müssen, können Sie eine shutdown hook .

Wenn Sie nach anderen Möglichkeiten suchen, Ihren Java-Prozess wissen zu lassen, dass es Zeit ist, ihn zu beenden, können Sie ihn auf einen Socket oder eine Standardeingabe oder eine Named Pipe warten lassen ...

Sie können auch in JVMTI

schauen     
ykaganovich 17.02.2011, 00:34
quelle
3

Sie könnten dies über JMX tun. JMX ist ein Standard-API-Set, mit dem Java-Anwendungen überwacht und verwaltet werden können.

Hier sind einige Links, um Sie zu starten:

Ссылка

Ссылка

Die Hauptidee ist dies:

a) Sie haben eine boolesche Variable, sagen wir isShutDownTrigerred. Sie haben einen Thread, der eine Endlosschleife ausführt, für 2 Sekunden ruht und diesen Variablenwert überprüft. Wenn der Wert wahr ist, werden Sie Code ausführen, der die Anwendung herunterfahren wird.

b) Dann schreibst du eine mxbean (siehe die obigen Links). Dieser mxbean wird verwendet, um den Wert "isShutDownTrigerred" in "true" zu ändern. Sie können ein Tool wie jconsole / jManage verwenden, um die mxbeans einer Java-Anwendung anzuzeigen und zu ändern. Sobald "isShutDownTriggered" auf "true" gesetzt ist, wird der obige Thread ihn kennen und das Herunterfahren der Anwendung ausführen

    
Zenil 17.02.2011 00:29
quelle

Tags und Links