Ejb3 Timer Service: Scheduling.


Ejb3 Timer Service: scheduling.


0. Índice de contenidos.

1. Introducción

Las tareas programadas son una realidad en las aplicaciones JEE: tablas que deben historificar, alarmas que se deben generar,… Lo normal puede ser la definición de un proceso batch que se invoca periódicamente mediante el planificador de tareas de Windows y, en UNIX, a través del cron, o de alguna solución comercial tipo control-M.

Ya hemos visto, en adictos, cómo planificar tareas en Jboss de mano de Francisco Javier Martínez Páez, quién me dio, a su vez, la idea sobre éste tutorial.

Ahora vamos a ver cómo planificar una tarea usando la solución estándar de JEE: EJB Timer Services.

El principal beneficio de su uso es que, al formar parte de estandar, no nos ligamos a un servidor de aplicaciones concreto.

EJB3 Time Service permite especificar un método que es invocado automáticamente después de un determinado intervalo de tiempo.

Vamos a ver un ejemplo de definición de un EJB3 Timer Service, que invoca periódicamente, una tarea ficticia, la generación alguna alarma de sistema.

Se da por hecho que el lector conoce lo básico sobre ejb3 y sus anotaciones.

2. Entorno.

El tutorial está escrito usando el siguiente entorno:
  • Hardware: Sobremesa Dell Dimension 6400, 2.13 Ghz, 2 Gb RAM
  • Sistema operativo: Windows XP Media center Edition
  • JDK 1.6.0_2
  • Eclipse 3.3.
  • Jboss 4.2.1.GA

3. Creación de un TimerService.

La implementación de un EJB Timer Service es realmente sencilla. Hablamos de EJB3, lo que implica hablar de anotaciones e injección de servicios:

Explicamos el código:
  • Injectamos el TimerService en la línea 23: @Resource TimerService timerService;
  • En la línea 46, creamos el temporizador (timerService.createTimer(…);) con dos parámetros: ejecución inicial (las 23:00:00 horas) e intervalo (cada 24 horas).
  • El método shutDownTimer() lista todos los temporizadores y acaba con ellos uno a uno. El hecho de parar el servidor de aplicaciones no implica el borrado de los temporizadores, con lo que si el método startUpTimer no invocase al método shutDownTimer antes de crear un nuevo temporizador, se irían acumulando.
  • Por último, el método execute está marcado con la anotación @Timeout. Será el método que se invoque a la hora señalada y después de finalizar cada intervalo.

Para poder acceder al servicio de temporizador debemos crear una interfaz, local o remota, en función de nuestras necesidades, que publique al menos el método que crea el temporizador:

4. Levantando el servicio.

Para levantar el servicio debemos invocar al método startUpTimer de la interfaz local. Pueden existir varias formas de hacerlo, nosotros vamos a invocarlo a través de un servlet de inicialización.

Definimos un servlet en nuestro web.xml, que se cargue en el arranque del servidor:

El código del servlet de inicialización que implementa la llamada al servicio local vendría a ser el siguiente:

Solo voy a hacer hincapié en la línea 53, la invocación al método de inicialización del Timer Service.

Doy por hecho que el resto del código se entiende (la variable jndiPrefix contendría el “nombre_de_ear.ear/” en el caso de desplegar la aplicación bajo un ear), y que tenemos definidas las propiedades de acceso al servicio vía jndi en un fichero de recursos (jndi.properties), visible desde el classLoader de la aplicación web:

Arrancando la aplicación en nuestro jboss:
  • el EJB Timer Service: debe estar correctamente registrado:
  • y debemos tenerlo activo… “esperando que den las 23:00:00 horas”.

5. Conclusiones.

Perfecto para planificar tareas programadas con un coste mínimo, puesto que delegamos su ejecución al contenedor de ejb’s del servidor de aplicaciones.

Por ahora no tenemos una herramienta con una interfaz gráfica de administración de dichas tareas, con lo que si el volumen de tareas es elevado quizás sea un poco tedioso administrarlas.

En función de nuestras necesidades, debemos ser nosotros los que decidamos si utilizamos el estándar o acudimos a aplicaciones de terceros para su gestión.

Un saludo.

Jose Manuel

Autentia