Tareas programadas con Spring y Quartz

En un post anterior explicamos cómo utilizar las clases wrapper de Spring para ejecutar una tarea a intervalos regulares de tiempo dentro de una aplicación web J2EE. En esta publicación integraremos Spring con el planificador Quartz para programar la misma tarea dentro de una aplicación J2EE.

Quartz es un servicio opensource de planificación de tareas que puede ser integrado con cualquier aplicación Java, desde la más pequeña aplicación stand-alone al más extenso sistema de e-commerce. Quartz puede ser utilizado para crear planificaciones simples o complejas para ejecuciones de decenas, cientos, o incluso miles de trabajos cuyas tareas son definidas como componentes Java estándar. Además incluye soporte para transacciones JTA y clustering. Es de uso libre bajo la licencia Apache 2.0.

Para instalarla en nuestra aplicación simplemente descargaremos el fichero quartz-x.x.x.tar.gz desde la web de descargas y extraeremos el fichero quartz-all-x.x.x.jar para incorporarlo a nuestra aplicación. En mi caso utilicé la versión 1.8.6, pese a no ser la última, debido a mi versión de Spring. Si tienes problemas con la última, te recomiendo que vayas bajando de versión hasta dar con la idónea. Dentro del fichero comprimido tar.gz existe una carpeta lib con las dependencias que tiene quartz con otras librerías. En mi caso necesité incluir en mi aplicación la librería slf4j-api-x.x.x.jar.

Lo primero que vamos a crear es la tarea a ejecutar. Será un método público dentro de una clase pública, tal y como se muestra en el siguiente código:

package es.activity.schedule;

public class RunMeTask
{
	public void printMe() {
		System.out.println("Ejecutando tarea programada");
	}
}

A continuación abrimos para editar el fichero XML de contexto de nuestra aplicación web Spring y añadimos un bean que haga referencia a la clase anterior:

<bean id="runMeTask" class="es.activity.schedule.RunMeTask" />

Una vez definida la tarea pasamos a configurar los principales conceptos de Quartz: Job, Trigger y Scheduler:

Job

Es la unidad de trabajo o tarea a ejecutar. Sería cualquier implementación de la interfaz org.quartz.Job. En Spring se han incluido varias implementaciones de la interfaz pero nosotros vamos a utilizar MethodInvokingJobDetailFactoryBean, la cual nos permite la ejecución de un método de cualquier clase java:

<bean id="schedulerJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
   <property name="targetObject" ref="runMeTask"></property>
   <property name="targetMethod" value="printMe"></property>
   <property name="concurrent" value="false"></property>
</bean>

Trigger

Es la unidad que conoce los detalles de la ejecución de la tarea y los instantes en los que se debe ejecutar. Sería cualquier implementación de la interfaz org.quartz.Trigger. Es este caso es el propio Quartz el que proporciona diversas implementaciones:

SimpleTrigger

Permite especificar una hora de comienzo, una hora de fin y un intervalo de ejecución, similar al ejemplo del post en el que hablábamos sobre la clase Timer incluida en el JDK. En el ejemplo ejecutamos el job tras un segundo de retardo y posteriormente cada 60 segundos.

<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail" ref="schedulerJob" />
        <property name="repeatInterval" value="60000" />
        <property name="startDelay" value="1000" />
</bean>

CronTrigger

Permite especificar expresiones cron de Unix para establecer fechas y horas de ejecución del job. En el ejemplo se ejecuta el job de lunes a viernes a las 8 de la mañana.

<bean id="timerCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">>
        <property name="jobDetail" ref="schedulerJob"></property>
        <property name="cronExpression" value="0 0 8 ? * MON-FRI"></property>
</bean>

Más información sobre expresiones cron en los siguientes enlaces:

  1. http://en.wikipedia.org/wiki/CRON_expression
  2. http://www.quartz-scheduler.org/documentation/quartz-1.x/examples/Example3

Scheduler

Por último tenemos que lanzar la ejecución de nuestro job mediante un planificador que gestione la ejecución a partir de la información especificada en el Trigger. Spring incorpora la clase SchedulerFactoryBean para ejecutar uno o varios trigger:

<bean id="GiaScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="timerCronTrigger"></ref>
            </list>
        </property>
</bean>

Con todo esto especificado en el fichero de contexto xml, desplegamos la aplicación en el servidor de aplicaciones y se ejecutará la tarea con la programación especificada.

 

Una respuesta a “Tareas programadas con Spring y Quartz”

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *