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");


1 comentario:

  1. While people in a lot of the world are confronted with the same challenges to play on-line, South Korea presents its citizens with some distinctive challenges. Read our blacklist to seek out|to search out} the unredeemed or unredeemable operations. We take care of on-line operators all day, every single day, so we will to} keep track of them for you. We cannot watch all of them, but when an operator goes unhealthy, they find their name listed in disgrace with a warning towards giving them your small business. Others still, have merely examined the operation and will tell you if the operator has a great popularity or an uneven history 토토사이트 of on-time payments, truthful rule enforcement, and so forth.

    ResponderEliminar