2013-06-06 13 views
6

Innerhalb der main() meiner Anwendung habe ich den folgenden Code, um Daten zu sichern, damit es nicht im Falle eines Systems heruntergefahren wird.Java Shutdown-Funktion wird nicht ausgeführt

//add hook to trigger Production Shutdown sequence 
    Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
     public void run() { 
      Production.shutdown(); 
     } 
    })); 

jedoch, ob ich die Stop Taste in meiner IDE drücken oder sich auf Eingabe über den log (Code unten) scheint es nie Daten in die Datenbank zu speichern oder alle Logs an die Konsole schreiben.

ctx.deploy(server); 

    server.start(); 

    //start the production process 
    Production.init(); 

    System.in.read(); 
    server.stop(); 

Wie kommt es, dass diese Abschaltfunktion nicht ausgeführt wird?

+1

Gibt es einen Code, der 'System.exit' aufruft, wenn eine Abschaltung stattfindet? Wenn Sie Probleme haben, einen zu finden, installieren Sie möglicherweise einen Sicherheitsmanager, der versucht, den Vorgang zu beenden. –

+0

Warum beenden Sie nicht() am Ende von 'main()' stattdessen? – fge

+0

@fge Es könnte mehrere Threads neben 'main' geben. Wenn dies der Fall ist, wird das Programm heruntergefahren, während die anderen Threads andere Dinge tun, was Probleme verursacht. – gparyani

Antwort

11

Sie müssen die Exit Schaltfläche, nicht Stop, see my answer here für weitere Details verwenden.

Beachten Sie, dass diese Funktion derzeit nur im Ausführungsmodus und nicht in Debug verfügbar ist.

+1

Und scheint, es funktioniert nicht auf Idee 14 ( –

+1

Gerade heute habe ich über Stop-Taste ignoriert Herunterfahren Hooks gefunden.Persönlich denke ich, es ist eine sehr schlechte Entscheidung, ich dachte immer Stop-Taste simuliert Strg + C (das ist SIGINT auf Unix). Und dann gibt es Debug ohne diese Exit-Taste kann versuchen, den Prozess zu beenden, indem er seine PID kennt ('jps' kann helfen), richtig? Falsch ... Windows und sein' taskkill'-Prozess kann nicht auf normale Weise gestoppt werden - nur mit Nachdruck ('taskkill/f/pid x') - es scheint, dass IDE es irgendwie "schützt" (sowohl im Debug- als auch im normalen Lauf). Dies macht das Testen von Shutdown-Hooks nicht einfacher. Debuggen einfach unmöglich. – virgo47

Verwandte Themen