Categorías del Tutorial

icono_twiter
Jose Manuel Sánchez Suárez

Consultor tecnológico de desarrollo de proyectos informáticos.

Puedes encontrarme en Autentia: Ofrecemos servicios de soporte a desarrollo, factoría y formación

Somos expertos en Java/J2EE

Ver todos los tutoriales del autor

Fecha de publicación del tutorial: 2007-12-12

Tutorial visitado 18.188 veces Descargar en PDF
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

A continuación puedes evaluarlo:

Regístrate para evaluarlo

Por favor, vota +1 o compártelo si te pareció interesante

Share |
Anímate y coméntanos lo que pienses sobre este TUTORIAL:

Fecha publicación: 2013-12-29-06:20:22

Autor: caarenas

Muy bueno, me ha servido mucho Gracias

Fecha publicación: 2009-08-11-11:40:00

Autor:

[Pablo] Cualquier tipo de ayuda sobre este problema me vendría muy muy bien, si hay otra forma de hacerlo sin anotaciones o de donde puedo sacar la libreria que contenga esas clases, es que la he buscado por google y en la pagina de Sun y no la he encontrado. Gracias.

Fecha publicación: 2009-08-11-11:38:19

Autor:

[Pablo] Hola, muchas gracias por este tutorial. Pero he probado a crear un ejemplo utilizando tu propio codigo y no me encuentra 2 de las clases que deberian estar en el javax.ejb. Son las clases Stateless y Timeout. He ido a buscarlas en mi j2ee.jar y evidentemente no están. ¿Será que tengo una librería incompleta o que estas clases están desfasadas y ahora se utiliza otra forma de realizar esto?