2012-10-11 7 views
22

Ich habe ein shutdown hook über hinzugefügt:Shutdown Haken funktioniert nicht in Eclipse

Runtime.getRuntime().addShutdownHook(myShutdownHook); 

Es funktioniert normalerweise, aber nicht, wenn ich auf die rote Stopptaste in Eclipse. Gibt es eine Möglichkeit, den Shutdown-Hook in Eclipse aufzurufen?

+0

die Fragen ist markiert doppelt zu einer Frage, die 2 Jahre später gefragt wurde – urir

+0

eigentlich der andere war zwei Jahre zuvor (09 statt 11). Sie haben wahrscheinlich den Tag (13) für das Jahr falsch gelesen. – Christoph142

Antwort

12

Die rote Stopp-Taste tötet gewaltsam die Anwendung, dh anmutig nicht, so dass die JVM nicht weiß, dass Die Anwendung wird beendet, daher werden die Shutdown-Hooks nicht aufgerufen.

Leider gibt es (zumindest in Windows) keine Möglichkeit, einen Mechanismus bereitzustellen, der sicherstellt, dass der Hook immer aufgerufen wird. Es ist nur etwas, das aufgerufen werden kann, aber es gibt keine Garantie.

+2

Bitte geben Sie eine Quelle an, die zitiert "es gibt keine Möglichkeit, einen Mechanismus bereitzustellen, der sicherstellt, dass der Hook immer aufgerufen wird", da die Seite http://docs.oracle.com/javase/7/docs/api/java/lang/ Laufzeit.html # addShutdownHook (java.lang.Thread) gibt eindeutig an, dass ** ** ausgeführt wird, wenn "das Programm normal beendet wird" oder "die virtuelle Maschine als Reaktion auf einen Benutzer/System-Interrupt beendet wird". – Pacerier

+1

@Pacerier Diese Aussage basiert auf einem Test, den ich gemacht habe, als ich ein Konsolenfenster schloss, in dem ein Batch-Skript lief, das eine Java-Anwendung aufruft. Beim Schließen des Fensters wurde der Shutdown-Hook nicht aufgerufen. –

+2

Dies und das Beenden der Anwendung von Eclipse sind Beispiele für das Programm, das * nicht normal beendet wird *. –

4

Können Sie nicht bekommen, um das Problem durch die Verwendung:

if (Boolean.parseBoolean(System.getenv("RUNNING_IN_ECLIPSE")) == true) { 
       System.out.println("You're using Eclipse; click in this console and  " + 
               "press ENTER to call System.exit() and run the shutdown routine."); 
       try { 
         System.in.read(); 
       } catch (IOException e) { 
         // TODO Auto-generated catch block 
         e.printStackTrace(); 
       } 
       System.exit(0); 
     } 

Bitte beachten Sie: How to get shutdown hook to execute on a process launched from Eclipse

+2

Ich kann nicht alle Benutzer bitten, zusätzliche Umgebungsvariable hinzuzufügen. – urir

+0

Zumindest als Workaround beim Debuggen und Experimentieren mag ich diese Idee - es ist viel praktischer als die anderen Workarounds für dieses Problem, das ich bisher gefunden habe. – Nic

0

Rote Stop-Taste beendet nur die Anwendung und laut Eclipse-Devs können sie nichts dagegen tun, siehe issue in Eclipse-Bug-Tracker.

0

@Pacerier - Aus dem Javadoc: In seltenen Fällen kann die virtuelle Maschine abbrechen, dh ohne sauberes Herunterfahren zu stoppen. Dies tritt auf, wenn die virtuelle Maschine extern beendet wird, z. B. mit dem Signal SIGKILL unter Unix oder dem Aufruf TerminateProcess unter Microsoft Windows. Die virtuelle Maschine kann auch abbrechen, wenn eine systemeigene Methode fehlerhaft arbeitet, indem sie beispielsweise interne Datenstrukturen beschädigt oder versucht, auf nicht vorhandenen Speicher zuzugreifen. Wenn die virtuelle Maschine abbricht, kann keine Garantie dafür übernommen werden, ob Shutdown-Hooks ausgeführt werden.

5

machte ich einen Hack von JavaProcess mit geschmückten ersetzt wird:

IProcess p = launch.getProcesses()[0]; 
    launch.addProcess(new JavaProcessDecorator(p)); 
    launch.removeProcess(p); 

und Dekorateur überschrieben wird Funktion beenden.

Zuerst auf den roten Knopf klicken, ich sende eine Nachricht an die Anwendung, die um sanfte Beendigung bittet. Wenn es nicht funktioniert, wird ein zweiter Klick auf den roten Knopf sie beenden.

-1

Wenn Sie nur testen möchten, ob der Haken funktioniert oder nicht, throw new RuntimeException() vom Triggerpunkt. Dies sollte den Shutdown-Hook auch von Eclipse aus aufrufen.

1

Ich weiß, ich bin ein bisschen spät auf die Party, aber ich fand diesen Thread auf der Suche nach Hilfe und so werden wahrscheinlich andere.

Wir hatten das gleiche Problem und löste es mit einem Eclipse plugin (unter Linux), die jetzt zusätzliche Stopp-Schaltflächen bietet. Ich hoffe, dass dies dient Ihnen allen so gut, wie es uns geholfen hat :)

Verwandte Themen