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