Spring schedule annotations

En este tutorial vamos a configurar tareas programadas con Spring y Quartz con anotaciones

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

Comentarios

Un comentario

Deja una respuesta

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

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

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

  • Responsable: IZERTIS S.A.
  • Finalidad: Envío información de carácter administrativa, técnica, organizativa y/o comercial sobre los productos y servicios sobre los que se nos consulta.
  • Legitimación: Consentimiento del interesado
  • Destinatarios: Otras empresas del Grupo IZERTIS. Encargados del tratamiento.
  • Derechos: Acceso, rectificación, supresión, cancelación, limitación y portabilidad de los datos.
  • Más información: Puedes ampliar información acerca de la protección de datos en el siguiente enlace:política de privacidad

Software Architect 👷‍♀️ | Tech Leader 🚀 | Senior Developer: Backend 🧩 and occasionally in Frontend 🖼️ | DevSecOps 🛠️ | Banking 🏛️ | Digital Transformation Agent 🎯 | Problem Solver (Mr. Wolf) 🐺

¿Quieres publicar en Adictos al trabajo?

Te puede interesar

22/06/2026

Juan Antonio Jiménez Torres

Vamos a instrumentalizar un SDD para un microservicio bancario. En este artículo sobre SDD - Spec Driven Development, instrumentalizado sobre OpenSpec vamos a construir una PoC de algo más serio que una tabla periódica. Un microservicio bancario muy simplificado que gestione cuentas y permita hacer transferencias

16/06/2026

Juan Antonio Jiménez Torres

Este es el segundo artículo sobre SDD, Spec Driven Development, instrumentalizado sobre OpenSpec. Pero esta vez nos acercaremos usando softwere gratuito. Por un lado OpenCode en lugar de ClaudeCode y usando el modelo gratuito Gemma4 de Google en lugar de otros de pago.

08/06/2026

Juan Antonio Jiménez Torres

Aprenderemos sobre SDD – Spec Driven Development instrumentalizado sobre OpenSpec. Haremos un primer acercamiento usando ClaudeCode con Sonnet, para luego, en un artículo posterior pasarnos a la versión gratuita de OpenCode con Gemma4