La mejor forma de cerrar elegantemente un progtwig de línea de comandos de Java

Estoy interesado en diferentes enfoques para cerrar con gracia un progtwig de línea de comandos de Java. Enviar una señal de muerte no es una opción.

Puedo pensar en algunos enfoques diferentes.

  1. Abra un puerto y espere una conexión. Cuando uno está hecho, se cierra con gracia.
  2. Mire para que se cree un archivo y luego cierre.
  3. Lea alguna entrada del terminal, como “ejecutar apagado”.

El tercero no es ideal, ya que a menudo hay una salida de progtwig bombeada a la pantalla. El primero requiere demasiado esfuerzo (soy flojo). ¿La mayoría de los progtwigdores usan la segunda opción? Si no, ¿qué más es posible / elegante / simple?

puedes probar algo como esto:

Runtime.getRuntime().addShutdownHook(new Thread() { public void run() { /* my shutdown code here */ } }); 

editar:

el gancho de apagado no realizará el cierre de la aplicación. en su lugar, le da al desarrollador una forma de realizar cualquier limpieza que desee en el momento del cierre.

de JavaDoc for Runtime (una buena lectura si está planeando usar este método):

Un gancho de cierre es simplemente un hilo inicializado pero no iniciado. Cuando la máquina virtual comienza su secuencia de apagado, iniciará todos los enganches de apagado registrados en algún orden no especificado y los dejará funcionar al mismo tiempo. Cuando todos los enganches hayan finalizado, se ejecutarán todos los finalizadores no invocados si se ha habilitado la finalización a la salida. Finalmente, la máquina virtual se detendrá. …

podría intentar usar Runtime.getRuntime().addShutdownHook() que debería satisfacer su requisito. De esta forma, puede registrar un gancho para realizar limpiezas, a fin de realizar un apagado completo.

EDITAR

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Runtime.html#addShutdownHook(java.lang.Thread) public void addShutdownHook (Thread hook) Registra un nuevo cierre de máquina virtual gancho. La máquina virtual Java se apaga en respuesta a dos tipos de eventos:

  • El progtwig sale normalmente, cuando sale el último hilo no daemon o cuando se invoca el método exit (equivalentemente, System.exit), o
  • La máquina virtual finaliza en respuesta a una interrupción del usuario, como escribir ^ C , o un evento en todo el sistema, como el cierre de sesión del usuario o el cierre del sistema.

El beneficio de la segunda opción, verificar un archivo sobre el primero, escuchar en un puerto, es que tiene alguna posibilidad de seguridad.

Puede configurar los permisos en el directorio donde se crea el archivo para que solo los usuarios apropiados puedan cerrar el progtwig. Si escucha en un puerto, cualquier usuario puede conectarse a él.

Si quería ir con la versión de socket, es muy simple de implementar. Aquí está el código:

 ServerSocket server = new ServerSocket(8080); System.out.println("Socket listening!"); server.accept(); System.out.println("Connection received!"); 

Puede incrustar fácilmente este código en un hilo separado que comience con su progtwig, y ​​luego hacer que modifique el estado global para iniciar el apagado.

Las primeras dos opciones son simples de implementar. También puedes usar algunas cosas JMX (no sé mucho sobre eso). Tomcat usa el primer enfoque y apliqué 1 y 2 en dos de mis proyectos.

Considere tener un componente JMX. Luego puede conectar con JConsole ya sea localmente o por la red, y comunicarse con su componente. Entonces el componente puede cerrar el progtwig correctamente.

Con Java 6 u 10 o posterior, puede hacer lo mismo con JVisualVM.

Sugeriría usar el gancho de cierre. Permitirá que su progtwig sea controlado utilizando las herramientas estándar del sistema operativo. Tampoco necesita ningún acceso adicional a recursos externos (disco, puertos, lo que sea).

    Intereting Posts