lunes, 28 de febrero de 2022

Como reaccionar cuando te apagan la aplicaión

El otro día le comentaba a Pedro que para no perder datos en una aplicación de java si te matan el proceso lo único que hacía era controlar la InterrupException y a correr....

Pero Pedro me dijo que estaba equivocado y... tenía razón. Si quieres ejecutar código cuando a tu proceso cuando el sistema operativo manda un SIGTERM (por ejemplo un liveness probe en kubernetes, un kill, ...) lo correcto en java es registrar un ShootdownHook

Es decir algo tal que así

public class App 
{
    public static void main( String[] args )
    {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {    
             System.out.println("Inside Add Shutdown Hook : " + Thread.currentThread().getName()) ;
            }
           }); 
        System.out.println( "Starting " + Thread.currentThread().getName() );

        try {
            Thread.sleep(100000);
        } catch (InterruptedException e) {
            System.out.println( "INTERRRUPTED" );
        }
        System.out.println( "END" );
    }
}

Hay que pensar que este hook se va a ejecutar siempre. Se pueden crear tantos hooks como quieras.

En .NET tienes la variable de Environment.HasShutdownStarted, pero también puedes un código parecido al de java suscribiéndote al evento ProcessExit del AppDomain por ejemplo:

// See https://aka.ms/new-console-template for more information
Console.WriteLine($"Start {Thread.CurrentThread.ManagedThreadId}");

var thread = Thread.CurrentThread;
AppDomain.CurrentDomain.ProcessExit += (s, e) => Console.WriteLine(
    $@"Process exiting {Thread.CurrentThread.ManagedThreadId} 
    Main Thread state {thread.ThreadState.ToString()}");

try
{
    Environment.HasShutdownStarted
    Thread.Sleep(10000);    
}
catch (System.Exception)
{
    
    Console.WriteLine("Interrupted");
}

Console.WriteLine("END");


No hay comentarios:

Publicar un comentario