Aplicaciones de gran escala requieren la habilidad de ejecutar tareas programadas o realizar procesos a horas específicas on en intervalos regulares. ¿Qué pasa si su aplicación esta sufriendo una fuga de memoria que requiere que la máquina JVM sea reiniciada por lo menos una vez por semana? Si necesita que se reinicie cuando el sistema no esta siendo usado, en ocasiones cuando el administrador del sistema se encuentra en casa. En otras ocaciones su aplicación que necesite una inactividad de 10 minutos todas las noches y permitir que copias de respaldo externas se ejecuten. Tal vez simplemente quiere programar que otras acciones inofensivas se lleven a cabo por ejemplo cada 5 minutos. Aquí le diremos como puede hacer todo esto usando el Java Service Wrapper.

Solución

El Java Service Wrapper proporciona una manera de programar tareas tales como: reinicios, apagados, vertederos de memoria, eventos personalizados a través de todas esas plataformas usando la funcionalidad del temporizador del Wrapper.

Temporizadores son definidos en el archivo de configuración del Wrapper, haciendo posible de una manera confiable de incluir todas las configuraciones en las aplicaciones mismas. Esto hace más fácil de implementar la aplicación en multiples servidores sabiendo que todo funcionará de manera consistente.

Temporizadores pueden programarse a horas y días específicos de la semana, así como en intervalos que van desde una vez por semana y hasta por segundo. Esta flexibilidad hace posible que al crear copias de respaldo sea fácil y también cuando surjan momentos de inactividad, sus usuarios no se vean afectados. De la misma manera, permite reducir horas extra de trabajo para sus administradores de sistemas y simplemente trabajar en jornadas de trabajo de una manera normal.

Descripción Técnica

El Wrapper permite definir multiples horarios, cada una de ellas haciendo uso de dos propiedades. La primer propiedad wrapper.timer.<n>.interval se usa para especificar cuando se debe ejecutar el temporizador. La segunda propiedad wrapper.timer.<n>.action se usa para especificar que tipo de acción(s) se deben llevar a cabo.

Propiedad wrapper.timer.<n>.interval:

La propiedad wrapper.timer.<n>.interval se usa para disparar la acción a una hora o intervalos específicos. El uso de comodines se usa para especificar dichos intervalos. A continuación presentamos unos ejemplos, por favor trate de revisar la documentación completa de la propiedad y aprender todo lo que se puede hacer.

Ejemplo de Configuración: Todos los días a las 03:55 am
wrapper.timer.1.interval=hour=3; minute=55
Ejemplo de Configuración: Todos los Lunes a las 03:55 am
wrapper.timer.1.interval=day-of-week=2; hour=3; minute=55
Ejemplo de Configuración: Cada 5 segundos
wrapper.timer.1.interval=second=*/5

Propiedad wrapper.timer.<n>.action:

La propiedad wrapper.timer.<n>.action se usa para especificar la acción o que pasa cuando el temporizador es disparado. En la mayoría de los casos es una sola acción, pero multiples acciones pueden separarse con el uso de una coma para poder ejecutar cada una de ellas en serie. A continuación presentamos unos ejemplos, por favor trate de revisar la documentación completa de la propiedad y aprender todo lo que se puede hacer.

Ejemplo de Configuración:Realizar un Vertedero de Memoria
wrapper.timer.1.action=dump
Ejemplo de Configuración:Realizar un Vertedero de Memoria y después reiniciar la máquina JVM
wrapper.timer.1.action=dump, restart

Configuración de multiples temporizadores:

Para establecer multiples temporizadores, simplemente agregue propiedades adicionales con números únicos en lugar del número 1 como se presenta arriba.

Ejemplo de Configuración: Multiples Temporizadores para realizar vertederos de memoria a las 03:55 am, 12:55 pm, y 21:55 pm todos los días
wrapper.timer.1.interval=hour=3; minute=55
wrapper.timer.1.action=dump
wrapper.timer.2.interval=hour=12; minute=55
wrapper.timer.2.action=dump
wrapper.timer.3.interval=hour=21; minute=55
wrapper.timer.3.action=dump

Ahora cubriremos algunos usos interesantes de temporizadores con sus aplicaciones.

Reinicios

Compatibilidad :3.3.0
Ediciones :Edición ProfesionaEdición Estándar (No Soportado)Edición de la Comunidad (No Soportado)
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/OSIBM z/Linux

Una de las acciones con temporizadores más comunes es un reinicio programado de la máquina JVM. A menudo los reinicios son hechos durante momentos de inactividad o uso, para evitar fuga de memoria o recursos, resincronización con base de datos externos o simplemente volver a cargar las Configuraciones del Wrapper.

Cuando una aplicación cuenta con fuga de memoria un administrador de sistemas a menudo tiene que solucionar el problema hasta que la fuga subyacente pueda ser arreglada por la máquina JVM, la aplicación o el proveedor de la biblioteca. Aún cuando la aplicación esta en un sistema interno, puede tomar algún tiempo para que el equipo desarrollador resuelva el problema. Mientras tanto, si una fuga se deja pasar desapercibida, la máquina JVM empezará a experimentar muchos errores durante los momentos de cargas máximas.

Para evitar este tipo de problemas, el Wrapper se puede configurar para reiniciar preventivamente la máquina JVM en ocasiones cuando el número de usuarios se conozca que sea mínimo. Por ejemplo los domingos por la mañana a las 3:00 am.

Ejemplo de Configuración: Reiniciar cada Domingo a las 03:00 am
wrapper.timer.1.interval=day-of-week=1; hour=3
wrapper.timer.1.action=restart
Ejemplo de Registro de Valores de Salida de Datos:
wrapper  | 2013/10/20 03:00:00 | Timer #1. Reiniciando JVM. 
jvm 1    | 2013/10/20 03:00:00 | TestWrapper: detener(0)
jvm 2    | 2013/10/20 03:00:05 | WrapperManager: Initializing...
jvm 2    | 2013/10/20 03:00:05 | TestWrapper: Inicializando...

Vertedero de Memoria

Compatibilidad :3.3.0
Ediciones :Edición ProfesionaEdición Estándar (No Soportado)Edición de la Comunidad (No Soportado)
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/OSIBM z/Linux

En ocasiones cuando se depura un problema, puede ser de gran ayuda efectuar Vertederos de Memoria en intervalos regulares para un análisis posterior. Se le puede pedir fácilmente al Wrapper que lo haga por ejemplo en intervalos de 5 minutos.

Ejemplo de Configuración: Solicitar Vertedero de Memoria cada 5 minutos
wrapper.timer.1.interval=minute=*/5
wrapper.timer.1.action=dump

ADVERTENCIA

Si desea tratar esto por favor asegúrese que la capacidad del archivo de registro de datos es suficiente para poder guardar dichos vertederos de memoria.

Pausar y Reanudar

Compatibilidad :3.5.0
Ediciones :Edición ProfesionaEdición Estándar (No Soportado)Edición de la Comunidad (No Soportado)
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/OSIBM z/Linux

Si ha configurado su aplicación para que pause entonces es posible usar temporizadores para pausar y reanudar la aplicación en horas específicas. Cuando una aplicación es pausada, el Wrapper se puede configurar para detener la máquina JVM pero mantener el Wrapper trabajando. Esto es ideal para programar inactividades y realizar copias de respaldo de base de datos u otras tareas que no puedan llevarse a cabo cuando la aplicación esta siendo usada.

El siguiente ejemplo de configuración detendrá la máquina JVM todas las noches a las 3:00 am y la resumirá otra vez a las 4:00 am.

Ejemplo de Configuración: Programar Pausa y Reanudo
wrapper.timer.1.interval=hour=3
wrapper.timer.1.action=pause
wrapper.timer.2.interval=hour=4
wrapper.timer.2.action=resume

Esto es de gran ayuda pero la aplicación siempre estará inactiva por una hora. Pero ¿qué pasa si queremos reanudar la aplicación una vez que se hayan completado las copias de respaldo necesarias?

La manera de llevarlo a cabo es usando la propiedad wrapper.commandfile así como el comando RESUME configurado al final del archivo de órdenes de su copia de respaldo de datos. El tiempo de resumen debe de configurarse por si surge algún problema con el archivo de órdenes. La acción "reanudar" será ignorada por parte del temporizador si la aplicación no es pausada.

Tareas de Java

Compatibilidad :3.5.0
Ediciones :Edición ProfesionaEdición Estándar (No Soportado)Edición de la Comunidad (No Soportado)
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/OSIBM z/Linux

Otro uso de la acción del temporizador RESUME es lanzar aplicaciones Java en las que su trabajo consta solo de efectuar una tarea específica y después salir. Al combinar la acción del temporizador RESUME con la definición de la propiedad wrapper.on_exit.<n> el Wrapper puede ser ordenado que entre en un estado de pausa cuando la JVM salga para después lanzarla cuando el temporizador sea disparado.

Por ejemplo la siguiente configuración no lanzará una JVM cuando el Wrapper sea iniciado por primera vez. Sin embargo, esperará para después lanzar la JVM en intervalos exactamente de 1 hora. La aplicación realizará algunas tareas para después salir. Cuando esto ocurra el Wrapper entrará en un estado de pausa en lugar de salir o reiniciar una JVM. Este proceso se repetirá cada hora hasta que el Wrapper sea apagado.

Ejemplo de Configuración: Programar Pausa y Reanudo
wrapper.pausable=TRUE
wrapper.pause_on_startup=TRUE
wrapper.timer.1.interval=minute=60
wrapper.timer.1.action=resume
wrapper.on_exit.default=PAUSE

El beneficio de usar una aplicación Java solo cuando se necesite en lugar de simplemente tener la máquina JVM en un estado de inactividad, es que se pueden ahorrar grandes recursos del sistema al apagar el proceso de la máquina JVM cuando no se necesite.

Acciones de Usuario Definido

Compatibilidad :3.5.0
Ediciones :Edición ProfesionaEdición Estándar (No Soportado)Edición de la Comunidad (No Soportado)
Plataformas :WindowsMac OSXLinuxIBM AIXFreeBSDHP-UXSolarisIBM z/OSIBM z/Linux

El Wrapper también hace posible programar la ejecución de comandos externos, enviar emails en intervalos regulares. Esto es hecho al usar eventos y acciones de usuario definido.

El siguiente ejemplo ejecutará una limpieza de archivos o lote de órdenes cada 10 minutos.

Ejemplo de Configuración: Programar Comando para la Ejecución de una Limpieza
wrapper.event.user_100.command.argv.1=cleanup
wrapper.timer.1.interval=minute=*/10
wrapper.timer.1.action=user_100

Para más información sobre como configurar comandos o enviar emails, por favor visite la página de Descripción de Eventos.

Referencia: Configuraciones de Propiedad

El Java Service Wrapper proporciona un conjunto completo de propiedades de configuración que le permiten hacer que el Wrapper se adapte exactamente a sus necesidades. Por favor, lea la documentación de las propiedades individuales para ver todas las posibilidades además de los ejemplos mostrados anteriormente.