Ir al contenido

Comprendiendo la Sintaxis Cron de @Scheduled en Spring

Spring Cron Scheduling
Autor
Harpal Singh
Software Engineer
Traducido por
Namastecode
Tabla de contenido

1. Introducción

En este tutorial, aprenderemos cómo utilizar la anotación @Scheduled en Spring con expresiones cron.

La expresión cron utilizada en Spring es ligeramente diferente de la expresión cron de unix, ya que requiere un campo adicional. Esto podría confundir a algunos de nosotros respecto al uso del sexto campo.

Comencemos por entender los diferentes tipos de expresiones cron y luego aprendamos a configurar la anotación @Scheduled en Spring.

2. Formato Estándar de Expresión Cron

En sistemas basados en Unix y en la mayoría de las herramientas en línea para expresiones cron, las expresiones cron típicamente constan de cinco campos separados por espacios:

 ┌───────────── minute (0 - 59)
 │ ┌───────────── hour (0 - 23) 
 │ │ ┌───────────── day of the month (1 - 31)
 │ │ │ ┌───────────── month (1 - 12) 
 │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday; 7 is also Sunday)
 │ │ │ │ │
 │ │ │ │ │
 * * * * * command to execute

Cada campo representa una unidad de tiempo específica y puede contener valores en el rango entre paréntesis. Por ejemplo, podemos escribir una expresión cron para indicar que se ejecute un trabajo todos los viernes a las 6 PM:

0 18 * * 5

Aquí, los asteriscos representan cada valor, de modo que esta expresión ejecutará el trabajo a las 6 PM todos los viernes.

Conectar esta expresión cron en @Scheduled ni siquiera iniciará nuestra aplicación Spring, ya que requiere un formato diferente. Veamos cómo podemos usar la anotación @Scheduled en Spring.

3. Uso de la anotación @Scheduled en Spring

Para configurar una tarea que se ejecute en un momento específico o en intervalos en una aplicación Spring, podemos utilizar la anotación @Scheduled junto con una expresión cron:

@Scheduled(cron = "0 0 18 * * 5")
public void scheduledTask() {
    // Task logic here
}

De manera similar, la expresión cron en este ejemplo ejecutará el método scheduledTask() todos los viernes a las 6 PM. Podemos ver que el formato es similar a la expresión cron estándar, pero requiere un campo adicional.

Entonces, Spring amplía el formato estándar al agregar un sexto parámetro al principio para representar los segundos:

 ┌───────────── second (0 - 59)
 │ ┌───────────── minute (0 - 59)
 │ │ ┌───────────── hour (0 - 23)
 │ │ │ ┌───────────── day of the month (1 - 31)
 │ │ │ │ ┌───────────── month (1 - 12)
 │ │ │ │ │ ┌───────────── day of the week (0 - 7) (0 and 7 both represent Sunday)
 │ │ │ │ │ │
 * * * * * *

Tener un control más detallado sobre la programación de tareas permite gestionar los trabajos cron hasta el nivel de segundos. Sin embargo, vale la pena señalar que la carga del sistema puede influir en gran medida en el tiempo de ejecución real de las tareas programadas.

Debemos señalar que para habilitar la programación en Spring, necesitamos agregar la anotación @EnableScheduling a nuestra clase de configuración.

Las expresiones cron son muy flexibles y se vuelven aún más poderosas cuando se combinan con caracteres especiales. Tengamos una visión general de estos caracteres especiales.

4. Caracteres Especiales en las Expresiones Cron

Al igual que en la sintaxis estándar de cron, las expresiones cron de Spring soportan caracteres especiales para ofrecer más flexibilidad.

Podemos usar el asterisco * para representar todos los valores posibles para un campo. Alternativamente, podemos usar un signo de interrogación ? para representar un valor no específico, que se utiliza típicamente para día del mes o día de la semana.

Por ejemplo, para ejecutar una tarea al inicio de cada hora todos los días de la semana:

@Scheduled(cron = "0 0 * * * ?")

También podemos especificar múltiples valores utilizando una coma o un rango de valores utilizando un guion -. Además, podemos usar la barra diagonal / para especificar incrementos.

Por ejemplo, para ejecutar una tarea cada 2 horas el sábado y el domingo entre el primer y el día 15 del mes:

@Scheduled(cron = "0 0 0/2 1-15 * 6,7")

Como podemos ver en el último ejemplo, podemos combinar múltiples caracteres especiales para crear patrones de programación complejos.

5. Conclusión

En este artículo, aprendimos sobre la expresión Cron en Spring y cómo usarla con la anotación @Scheduled. Primero, observamos el formato estándar de las expresiones cron de Unix y luego vimos cómo Spring lo extiende al agregar un sexto parámetro para los segundos. Finalmente, exploramos cómo usar caracteres especiales para crear patrones de programación complejos.

Relacionados

Obtener valores definidos en el archivo de propiedades en Spring
Spring Properties Basics
Configurando el Puerto para una Aplicación Spring Boot
Spring Basics
Testcontainers en Pruebas de Integración de Spring Boot
Spring Testcontainers Testing