2011-02-16 21 views
8

Estoy usando un controlador de señal personalizado para capturar las señales TERM, ABRT e INT en un daemon java personalizado. Tengo este controlador en el código para poder enviarle señales TERM y cerrar correctamente el programa a través del comando kill. El manejador de la señal funciona en este momento, pero cuando compilo el código que estoy recibiendo la siguiente advertencia (muchas veces):Enviando señales a una JVM en ejecución

advertencia: sun.misc.SignalHandler es Sun API propietario y puede ser eliminado en un futuro liberar

durante el uso de estas clases:

import sun.misc.SignalHandler; 
import sun.misc.Signal; 

¿hay una mejor manera de enviar señales a una JVM corriendo para iniciar un apagado del hilo principal? No me gusta tener mi código vinculado a esta API cuando podría eliminarse en el futuro.

Este código funciona hoy en día en Solaris y HPUX utilizando 1.5.0_22 JVM. Cualquier ayuda o sugerencia sería muy apreciada. He utilizado este documento, de IBM, para desarrollar el manejador de la señal:

http://www.ibm.com/developerworks/java/library/i-signalhandling/

+1

Por lo que sé que no hay una API pública para el manejo de señal (probablemente porque es muy específica del sistema operativo), por lo que tendrá que aguantar esta advertencia. – biziclop

Respuesta

17

Antes que nada, entienda que esto es solo una advertencia estándar para el paquete sun.misc. Le informan que la API que está utilizando no es una API estándar de Java. No significa que estén planeando activamente eliminar esta API en el futuro. http://java.sun.com/products/jdk/faq/faq-sun-packages.html

En cuanto a su pregunta, no está muy claro para mí por qué el proceso java predeterminado maneja las señales de muerte no es suficiente para usted: How to stop java process gracefully?. Si necesita agregar lógica adicional, puede agregar un shutdown hook.

embargo, si usted está buscando otras maneras para que su proceso de java sabe que es hora de salir, puede hacer que se escuche en un socket, o la entrada estándar, o una tubería con nombre ...

Usted podría También quiero mirar en JVMTI

+0

Tu "Cómo detener un proceso de Java con gracia" fue muy útil. Hice una búsqueda y no estoy seguro de cómo me perdí esa. Revisé mi script que realiza el kill y está haciendo "kill -9". Creo que estoy enviando la señal equivocada, de acuerdo con ese enlace, y el hecho de matar la aplicación (razón por la cual tuve que atrapar la señal durante el cierre para una salida elegante). Voy a probar una señal diferente, y el cierre se engancha, y veré si esa es una solución mejor. – jmq

+3

Esto finalmente funcionó y pude eliminar esas dos clases del proyecto. Su sugerencia fue útil, gracias. – jmq

+0

Me alegra oír eso. – ykaganovich

3

usted puede hacer esto a través de JMX. JMX es un conjunto estándar de apis que se puede usar para monitorear y administrar aplicaciones Java.

Aquí están algunos enlaces para empezar:

http://onjava.com/pub/a/onjava/2004/09/29/tigerjmx.html

http://www.ibm.com/developerworks/java/library/j-jtp09196/index.html?ca=drs

La idea principal es la siguiente:

a) Tendrá una variable booleana, por ejemplo isShutDownTrigerred. Tendrás un hilo que ejecutará un ciclo infinito, dormirá durante 2 segundos y seguirá revisando este valor variable. Cuando el valor sea verdadero, ejecutará un código que apagará la aplicación.

b) A continuación, escriba un mxbean (consulte los enlaces de arriba). Este mxbean se usará para cambiar el valor "isShutDownTrigerred" a verdadero. Puede usar una herramienta como jconsole/jManage para ver y modificar los mxbeans de una aplicación java. Tan pronto como "isShutDownTriggered" se establezca en verdadero, el hilo anterior lo sabrá y ejecutará el cierre de la aplicación