Spring schedule annotations

1
12938

Spring schedule annotations.

0. Índice de contenidos.


1. Introducción

Tampoco ha llovido tanto, o si, desde que Juan, nos enseñara como
configurar tareas programadas con el soporte de spring y quartz.
El caso es que a partir de la versión 3 de spring la configuración se ha reducido sensiblemente y además se puede configurar vía anotaciones.

En este tutorial, vamos a ver cómo llevar a cabo dicha configuración
de una manera más simple, haciendo uso de la misma clase de ejemplo del tutorial de referencia de Juan.


2. Entorno.

El tutorial está escrito usando el siguiente entorno:

  • Hardware: Portátil MacBook Pro 17′ (2.93 GHz Intel Core 2 Duo, 4GB DDR3 SDRAM).
  • Sistema Operativo: Mac OS X Snow Leopard 10.6.1
  • Spring 3.1 M1
  • Quartz 1.5.2


3. Dependencias.

Para hacer uso del soporte de tareas programadas de spring necesitaremos incluir en nuestro proyecto las siguientes dependencias, como siempre, lo mostramos haciendo uso de maven:

	<dependencies>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>3.1.0.M1</version>
		</dependency>
		<dependency>
	    	<groupId>quartz</groupId>
	    	<artifactId>quartz</artifactId>
	    	<version>1.5.2</version>
		</dependency>

Para nuestras pruebas en el entorno de tests con jUnit y el soporte de inyección de spring, serán necesarias las siguientes:

		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.8.2</version>
			<scope>test</scope>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>3.1.0.M1</version>
			<scope>test</scope>
		</dependency>		
	</dependencies>


4. Configuración vía applicationContext.

Si llevamos a cabo la configuración a través del fichero de configuración de spring, sin anotaciones, sería la siguiente:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
	

	<!-- Configuración de tareas programadas -->
	<bean id="memoryViewer" class="com.autentia.tutoriales.springschedule.MemoryViewer"/>  

	<task:scheduled-tasks>
	    <task:scheduled ref="memoryViewer" method="checkMemory" fixed-delay="500"/>
	</task:scheduled-tasks>

</beans>

Si la comparamos con las de versiones anteriores veis que se reduce sensiblemente. Equivaldría a lo que antes configurábamos de la siguiente forma:

	<!-- Configuración de tareas programadas -->
	<bean id="memoryViewer" class="com.autentia.tutoriales.springschedule.MemoryViewer"/>
	
	<!-- Clase de Spring que se encarga de la llamada al metodo checkMemory de la clase MemoryViewer -->
	<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
	  <property name="targetObject" ref="memoryViewer" />
	  <property name="targetMethod" value="checkMemory" />
	</bean>
	
	<!-- Configuracion de la planificacion de la tarea -->
	<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
	    <property name="jobDetail" ref="jobDetail" />
	    <!-- Empieza pasados 10 segundos -->
	    <property name="startDelay" value="10000" />
	    <!-- Repite cada 5 segundos -->
	    <property name="repeatInterval" value="5000" />
	</bean>
	
	<!-- Factoria de creacion del bean encargado de realizar la planificacion de la tarea -->
	<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
	    <property name="triggers">
	    	<ref bean="simpleTrigger" />
	    </property>
	</bean>

Ahora disponemos de un espacio de nombres propio para las tareas programadas que nos permiten realizar el siguiente tipo de configuraciones:

	<task:scheduled-tasks>
		<task:scheduled ref="dailyRepairRepository" method="clearLastWeekRepairCache" cron="0 0 2 ? * MON"/>
	    <task:scheduled ref="dailyRepairRepository" method="clearLastMonthRepairCache" cron="0 30 2 1 * ?"/>
	    <task:scheduled ref="volumeRepairReportProcessor" method="processNoProcessedReports" fixed-delay="30000"/>
	    <task:scheduled ref="activityReportProcessor" method="processNoProcessedReports" fixed-delay="30000"/>
	</task:scheduled-tasks>

Donde el atributo ref no es más que un bean de spring, el atributo method apunta a un método del bean antes dicho y podemos programar la periodicidad con una cronExpression o un delay.


5. Haciendo uso de anotaciones.

Depende de nuestras preferencias, podemos hacer uso de anotaciones para configurar directamente en las propias clases de sevicio la ejecución de métodos como tareas programadas, incluyendo la cronExpression
o el delay en la propia anotación.

Para activar la configuración vía anotaciones debemos prescindir de lo anterior e incluir simplemente la siguiente configuración:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" 
	xmlns:task="http://www.springframework.org/schema/task"
	xsi:schemaLocation="
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
		http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd">
		
	<context:annotation-config />
	
	<context:component-scan base-package="com.autentia.tutoriales" />
	
	<task:annotation-driven/>
	

Con ello, podemos añadir las siguientes anotaciones directamente en nuestras clases de servicio:

@Service
public class MemoryViewer {

	@Scheduled(fixedDelay=500)
	public void checkMemory() {
		...
	}
	
	@Scheduled(cron="0 0 2 ? * MON")
	public void _checkMemory() {
		...
	}
}


6. Referencias.


7. Conclusiones.

Reducimos la configuración, lo que redunda en claridad y mantenibilidad.

Un saludo.

Jose

jmsanchez@autentia.com

1 COMENTARIO

DEJA UNA RESPUESTA

Por favor ingrese su comentario!

He leído y acepto la política de privacidad

Por favor ingrese su nombre aquí

Información básica acerca de la protección de datos

  • Responsable:
  • Finalidad:
  • Legitimación:
  • Destinatarios:
  • Derechos:
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad