2010-05-08 15 views
6

Tengo la aplicación J2SE ejecutándose en Linux. He detenido la secuencia de comandos de la aplicación en la que estoy haciendo matar al pid J2SE. Esta aplicación J2SE tiene 6 subprocesos de usuario que se ejecutan de manera infinita, que sondearán para algunos registros específicos en el backend DB.Invocar un método de limpieza para el subproceso de usuario Java, cuando JVM detiene el subproceso

Cuando se elimina este java pid, necesito realizar algunas operaciones de limpieza para cada uno de los hilos de ejecución larga, como conectarme a DB y configurar el estado de algunas transacciones que están en progreso para vaciar.

Hay una manera de escribir un método en cada uno de los subprocesos, que JVM llamará cuando el subproceso se detendrá.

Respuesta

7

Siempre se puede tratar de implementar un gancho cerrado usando Runtime.addShutDownHook, o encapsular el código de larga duración en un try y la limpieza en finally.

Un ejemplo mínimo que hace aproximadamente lo que quiere hacer (pero para un solo hilo de trabajo por simplicidad).

public class Test extends Thread { 

    static volatile boolean keepRunning = true; 

    public static void main(String[] args) throws InterruptedException { 
     final Thread t = new Test(); 
     t.start(); 
     Runtime.getRuntime().addShutdownHook(new Thread() { 
      public void run() { 
       System.out.println("Shutting down..."); 
       keepRunning = false; 
       t.interrupt(); 
       try { 
        t.join(); 
       } catch (InterruptedException e) { 
       } 
      } 
     }); 
    } 

    public void run() { 
     while (keepRunning) { 
      System.out.println("worknig..."); 
      try { 
       sleep(1000); 
      } catch (InterruptedException e) { 
      } 
     } 

     System.out.println("cleaning up."); 
    } 
} 

de salida cuando se interrumpe con Ctrl-C:

worknig... 
worknig... 
worknig... 
^CShutting down... 
cleaning up. 

salida al matar con kill pid

worknig... 
worknig... 
worknig... 
worknig... 
Shutting down... 
cleaning up. 

salida al matar con kill -9 pid

worknig... 
worknig... 
worknig... 
worknig... 
worknig... 
Killed 

(n limpieza ejecutado.)

+0

Gracias por la explicación detallada. El proceso de Java se ejecuta en Red Hat Linux OS. Y en mi secuencia de comandos stopApplication, obtengo el PID del proceso java (almacenado en un archivo, al iniciar) y hago kill -15 (SIGTERM), duermo durante 40 segundos y luego hago kill -9 del pid . Solo quiero saber, cuando se ejecuta kill -15 pid, ¿se invocará Runtime.addshutdownHook? – user309281

+0

Sí. 'kill -15 PID' produce la misma salida del programa java que la salida de' kill PID' (Ver arriba). – aioobe

Cuestiones relacionadas