2009-09-11 10 views
15

Tengo una aplicación independiente en la que tengo que solicitar al usuario un cuadro de diálogo de confirmación para guardar los cambios realizados por él cuando intenta apagar el sistema por start-->shutdown.Manejo de señales usando "TERM"

Me enteré de que al usar signalhandlers podemos hacerlo.
¿Puede alguien ayudarme cómo utilizar los gestores de señales

+1

¿Cómo lidiar con la pregunta SIGINT: http://stackoverflow.com/questions/2541475/capture- sigint-in-java –

Respuesta

33

actualización de mayo de 2012 (2 años y medio después)

Trejkaz comentarios:

En las versiones actuales de Java el código de manejo de señales falla porque la señal "INT" está "reservada por la VM o el SO".
Además, ninguno de los otros nombres de señal válidos realmente se activan cuando algo solicita que la aplicación se cierre (solo probé minuciosamente todos los que pude averiguar sobre ...)
El gancho de cierre funciona principalmente pero encontramos que nuestro caso no está disparando, por lo que el siguiente paso es, obviamente, que recurrir a registrar un manejador detrás de la JVM volver

en el capítulo "Integrating Signal and Exception Handling" de la "Troubleshooting Guide for HotSpot VM" menciona las señales "SIGTERM, SIGINT, SIGHUP" solo para Solaris OS y Linux.
Solo se menciona el Manejo de excepciones en Windows.

respuesta

original (septiembre de 2009)

un ShutdownHook debe ser capaz de manejar ese caso

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

(con caveats)
Consulte también:

como una ilustración de manejo de señal 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 - pero eso se basa en el árbol sun.misc. *, que ahora está en desuso. ¿Y pistas sobre cuál es la clase actual que deberíamos usar? – zigdon

+0

@zigdon: No estoy seguro, en realidad. Esas clases todavía están allí en jdk o openjdk, http://www.docjar.com/docs/api/sun/misc/SignalHandler.html, y aunque no son parte de la interfaz pública compatible (http://www.oracle.com/technetwork/java/faq-sun-packages-142232.html), pero otras soluciones podrían incluir JVMTI o JMX (http://stackoverflow.com/questions/5023520/sending-signals-to-a -running-jvm) – VonC

+1

En las versiones actuales de Java, este código de manejo de señal falla porque la señal "INT" está "reservada por la VM o el SO". Además, ninguno de los otros nombres de señal válidos realmente se activan cuando algo solicita que la aplicación se cierre (solo probé minuciosamente todos los que pude averiguar sobre ...) El gancho de cierre funciona en su mayoría, pero encontramos que en nuestro caso no está disparando, por lo que el siguiente paso es, obviamente, recurrir a registrar un controlador detrás de la JVM. :) – Trejkaz