2009-09-11 7 views
15

J'ai une application autonome dans laquelle je dois inviter l'utilisateur avec une boîte de dialogue de confirmation pour enregistrer les modifications apportées par lui lorsqu'il essaie d'arrêter le système par start-->shutdown. J'ai appris à savoir qu'en utilisant signalhandlers nous pouvons le faire.
quelqu'un peut me aider à utiliser les gestionnaires de signauxTraitement du signal en utilisant "TERM"

+1

Comment traiter la question de SIGINT: http://stackoverflow.com/questions/2541475/capture- sigint-in-java –

Répondre

33

Mise à jour de mai 2012 (2 ans et demi plus tard)

Trejkaz commentaires:

Sur les versions actuelles de Java ce code de traitement du signal ne parvient parce que le signal "INT" est "réservé par la machine virtuelle ou le système d'exploitation".
De plus, aucun des autres noms de signaux valides ne se déclenche lorsque quelque chose demande à l'application de se fermer (j'ai juste minutieusement testé tous ceux que j'ai pu découvrir ...)
Le crochet d'arrêt fonctionne principalement mais nous trouvons que notre cas, il ne se déclenche pas, donc la prochaine étape est évidemment de recourir à l'enregistrement d'un gestionnaire derrière le dos de machine virtuelle Java

le chapitre « Integrating Signal and Exception Handling » du « Troubleshooting Guide for HotSpot VM » mentionne les signaux « SIGTERM, SIGINT, SIGHUP » seulement pour Solaris OS et Linux.
Seules les exceptions de gestion sous Windows sont mentionnées.


réponse originale (septembre 2009)

un ShutdownHook devrait être en mesure de traiter ce cas

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 
    public void run() { 
     // what you want to do 
    } 
})); 

(avec caveats)
Voir aussi:

comme une illustration de traitement du signal simple:

public class Aaarggh { 
    public static void main(String[] args) throws Exception { 
    Signal.handle(new Signal("INT"), new SignalHandler() { 
     public void handle(Signal sig) { 
     System.out.println(
      "Aaarggh, a user is trying to interrupt me!!"); 
     System.out.println(
      "(throw garlic at user, say `shoo, go away')"); 
     } 
    }); 
    for(int i=0; i<100; i++) { 
     Thread.sleep(1000); 
     System.out.print('.'); 
    } 
    } 
} 
+0

Cool - mais cela dépend de l'arbre sun.misc. *, qui est maintenant obsolète. Et des indices quant à la classe actuelle que nous devrions utiliser? – zigdon

+0

@zigdon: Pas sûr, en fait. Ces classes sont toujours présentes dans jdk ou openjdk, http://www.docjar.com/docs/api/sun/misc/SignalHandler.html, et même si elles ne font pas partie de l'interface publique prise en charge (http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html), mais d'autres solutions peuvent impliquer JVMTI ou JMX (http://stackoverflow.com/questions/5023520/sending-signals-to-a -running-jvm) – VonC

+1

Sur les versions actuelles de Java, ce code de gestion de signal échoue car le signal "INT" est "réservé par la VM ou le système d'exploitation". De plus, aucun des autres noms de signaux valides ne se déclenche lorsque quelque chose demande à l'application de se fermer (j'ai juste minutieusement testé tous ceux que je pouvais trouver sur ...Le hook d'arrêt fonctionne principalement mais nous constatons que dans notre cas il ne tire pas, donc l'étape suivante est évidemment de recourir à l'enregistrement d'un handler derrière le dos de la JVM. :) – Trejkaz

Questions connexes