2017-02-09 2 views
7

Ich brauche JVM Rückgabecode nach meiner Anwendung Ergebnis zu ändern.Wie Return-Code im Shutdown-Haken bekommen

Aber es ist riskant ausdrücklich System.exit nennen (Code) Coz der Anwendung kompliziert ist und es schwierig ist, das Ende der laufenden Threads zu identifizieren.

So komme ich mit mit shutdown Haken bis zu dem Return-Code, bevor JVM Ausgang zu ändern.

Aber es gibt ein Problem, dass, wie kann ich die ursprüngliche Rückgabecode von JVM erhalten Coz es ein Fehlercode möglicherweise nicht 0.

+0

aber wie den ursprünglichen Exit-Code in Haupt-Thread kennen. Was, wenn es -1 sein sollte, aber ich setze es auf 1 im shutdown hook. –

+0

Was möchten Sie mit dem ursprünglichen Exit-Code tun, wenn Sie die Codebasis für Ihr Anwendungsergebnis festlegen möchten? – ravthiru

+0

Ich habe Angst, dass der ursprüngliche Code Fehlercode ist und ich den Fehlercode nicht ändern sollte. –

Antwort

5

Sie nicht Exit-Methode in Shutdown-Hook aufrufen sollte, System.exit(status) ruft intern Runtime.getRuntime().exit(status); denen Veranlassen Sie, dass Ihre Anwendung unbegrenzt blockiert wird.

Gemäß den JavaDoc

Wenn diese Methode aufgerufen wird, nachdem die virtuelle Maschine ihre Abschaltsequenz dann begonnen, wenn Herunterfahren Haken diese Methode ausgeführt wird auf unbestimmte Zeit blockiert.

Sie haben keinen Zugriff auf status, da es sich ändern könnte, auch nachdem alle Shutdown-Hooks aufgerufen wurden.

1

Da Shutdown Hooks und Exit-Status nicht kompatibel sind, können Sie eine Throwable, deren einzige Funktion ist in dem Hauptverfahren schaffen gefangen werden. Dann wird der Catch-Block zu Ihrem Shutdown-Block. Dort können Sie System.exit() aufrufen und Ihren Shutdown-Code sogar beibehalten, wenn Sie möchten.

class Emergency extends Throwable{ 
    int exit = 0; 
} 

public final class Entry { 

    public static void main(String[] args){ 
      try { 
       throw new Emergency(); 
      } catch (Emergency e) { 
       // Shut down the app 

      } 
    } 

} 
+0

Konnte fehlschlagen, wenn ein Mechanismus zum Abfangen und Protokollieren von Ausnahmen dazwischen besteht. –

+0

Ich denke, es könnte funktionieren, wenn Sie direkt Throwable' anstatt '' Exception' verlängern. –

+0

Es müsste sich Throwable erstrecken, da diese nur selten gefangen werden. Ich werde in einer Sekunde einen kleinen Ausschnitt posten – efekctive

Verwandte Themen