2017-02-07 1 views
0

Ich habe Windows Desktop-Anwendung auf Java basiert.Herausfinden, wer jvm shutdown hook ruft

Ich habe defaultuncaughterexceptionahandler und shutdown haken in meiner Anwendung.

Ich habe einige Benutzer namens Exit-Punkte wie, Benutzer klickt auf Beenden, einige Fehlerbedingungen usw. Alle Benutzer Exit Punkte haben richtige Protokolle, die von der Abmeldung Hook folgen.

Jetzt für einen meiner Benutzer die Anwendung wird von Zeit zu Zeit verlassen. Hier ruft der Benutzer keine Benutzerausstiegspunkte auf. Herunterfahren-Hook-Protokolle werden gedruckt. Es gibt keine Ausnahme von defaultuncaughtexception-Handler.

Ich bin nicht in der Lage zu finden, wer die system.exit und damit den Shutdown-Haken aufruft. Kann ich irgendwie finden, was den shutdown-hook oder system.exit() aufruft? Drucken von Shutdown-Haken lässt mich denken, dass eine ordnungsgemäße jvm Shutdown nicht abrupt ist.

Mit besten Grüßen, Saurav

+0

Werfen, fangen und protokollieren Sie eine Ausnahme. –

+0

Aber sollte dann nicht aufgefangen Exception-Handler die nicht abgefangene Ausnahme fangen? ... auch die Protokolle zeigt verschiedene Szenario, bevor der System-Exit passiert – saurav

+0

Was? Ich sagte, um es zu fangen. –

Antwort

1

Wenn Sie den Verdacht haben, dass jemand System.exit(…) oder eine ähnliche Funktion ruft ausdrücklich, können Sie es einem mit SecurityManager abfangen:

System.setSecurityManager(new SecurityManager() { 
    @Override 
    public void checkExit(int status) { 
     new Exception("exit attempt with return code "+status).printStackTrace(); 
    } 
    // note that all dedicated check... methods delegate to the two below, 
    // so overriding these is sufficient to enable all other actions 
    @Override 
    public void checkPermission(Permission perm, Object context) { } 

    @Override 
    public void checkPermission(Permission perm) { } 
}); 

Dies wird jedoch nicht Abschaltung verursacht abfangen durch externe Ereignisse, wie ein TERM-Signal usw.

+0

Vielen Dank Holger seine Arbeit, aber ich die Kehrseite ist, dass ich einen Sicherheitsmanager komplett erweitern muss, um andere Methoden davon zu entspannen – saurav

+1

Oh, ich habe diesen Aspekt vergessen. Siehe meine aktualisierte Antwort. – Holger

+0

das ist nützlich ... danke nochmal Holger – saurav

2

Wenn Sie OpenJDK/Oracle JDK ausführen, können Sie einen "System" Shutdown-Hook registrieren, der einen Thread mit Dump ablegt leiteten Shutdown-Prozess:

sun.misc.SharedSecrets.getJavaLangAccess().registerShutdownHook(7, true, 
      () -> { 
       System.out.println(Thread.currentThread()); 
       new Exception("Who called me?").printStackTrace(); 
      }); 

Dies wird auch für externe Veranstaltungen wie Ctrl+C arbeiten.

+0

danke apangin es funktioniert – saurav

Verwandte Themen