java scala console jvm reliability

java - ¿Cómo lidiar con ^ C en las aplicaciones de la consola JVM?



scala console (3)

Cuando un JVM-run (escrito en Scala en realidad, pero tiendo a creer que la solución va a ser muy similar para Groovy, Clojure o Java puro) el programa de la consola de la mía es terminado por el usuario presionando Ctrl + C (o por la secuencia de apagado del sistema, no sé si hay alguna diferencia para un programa), ¿cómo me aseguro de que los recursos externos modificados por la aplicación (bases de datos, archivos, recursos abstractos del servicio web) se dejen en un estado predecible, ¿estado no lógicamente corrupto?


Eche un vistazo a Runtime.addShutdownHook .

Por lo general, lo usaría así:

Runtime.addShutdownHook(new Thread() { public void run() { // do your clean up here. } });


Puede atrapar esta señal y cerrar recursos. La mayoría de los servicios no necesitan estar cerrados correctamente, sin embargo, los archivos que usted escribe suelen hacerlo.

Es posible simplemente agregar un gancho de apagado es todo lo que necesita. Pero probaría esto para tu situación.


Puedes intentar implementar un gancho de cierre como otros señalaron PERO:

En circunstancias excepcionales, la máquina virtual puede abortar, es decir, dejar de funcionar sin apagarla limpiamente. Esto ocurre cuando la máquina virtual finaliza externamente, por ejemplo con la señal SIGKILL en Unix o la llamada TerminateProcess en Microsoft Windows. La máquina virtual también puede abortar si un método nativo falla al, por ejemplo, corromper las estructuras internas de datos o intentar acceder a una memoria inexistente. Si la máquina virtual aborta, no se puede garantizar si se ejecutarán o no los ganchos de cierre.

Supongo que tendrías que introducir contexto transaccional en tu aplicación, creo. Para las bases de datos es bastante fácil, para el sistema de archivos puede ver Apache Commons Transaction