@Scheduled en SPRING BOOT

En Spring, la anotación @Scheduled se utiliza para programar la ejecución de un método a intervalos regulares o en momentos específicos. Esta anotación es comúnmente utilizada en aplicaciones de Spring Framework para automatizar tareas programadas, como tareas de limpieza, generación de informes, actualizaciones de datos, entre otros.

Activar el soporte para Scheduling

Para comenzar se necesita activar el soporte a través de la anotación @EnableScheduling para que Spring sepa que tiene que empezar a ver si en el proyecto existe algún tipo de método con la anotación @Scheduled y poder ejecutarlo según su las opciones definidas. La forma de activar el soporte es bastante fácil, de la siguiente forma:

@Configuration
@EnableScheduling
public class Main {
    ...
}

La anotación @Scheduled

La anotación @Scheduled se puede aplicar a métodos de una clase de bean de Spring, y Spring se encargará de invocar el método de acuerdo con la programación especificada. La anotación admite varios atributos que le permiten personalizar el cronograma de ejecución. Algunos de los atributos más comunes incluyen:

Atributo – cron

Permite especificar una expresión cron que define cuándo se debe ejecutar el método. Las expresiones cron son muy flexibles y pueden describir momentos precisos, intervalos regulares y patrones complejos de tiempo.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class CronScheduledTask {

    @Scheduled(cron = "0 0 12 * * ?") // Ejecuta el método todos los días a las 12:00 PM
    public void doCronTask() {
        // Código de la tarea programada
        System.out.println("Tarea programada ejecutada a las 12:00 PM.");
    }
}

UNIX Cron

La expresión cron es una notación utilizada para definir horarios y momentos específicos en el tiempo. Se utiliza comúnmente en sistemas operativos tipo Unix, así como en sistemas de programación de tareas y programación de trabajos en diversas aplicaciones, incluido Spring Framework, para programar tareas y eventos en función de patrones de tiempo. Una expresión cron consta de cinco o seis campos que representan diferentes unidades de tiempo, y se utiliza para definir cuándo debe ocurrir una tarea o evento.

  1. Segundos (0-59): El primer campo representa los segundos en un minuto. Puede tomar valores de 0 a 59. Por ejemplo, si se establece en 30, la tarea se ejecutará cuando los segundos sean igual a 30.
  2. Minutos (0-59): El segundo campo representa los minutos en una hora. Puede tomar valores de 0 a 59. Por ejemplo, si se establece en 15, la tarea se ejecutará cuando los minutos sean igual a 15.
  3. Horas (0-23): El tercer campo representa las horas en un día. Puede tomar valores de 0 a 23. Por ejemplo, si se establece en 8, la tarea se ejecutará a las 8:00 AM.
  4. Días del mes (1-31): El cuarto campo representa los días del mes. Puede tomar valores de 1 a 31, dependiendo del mes. Por ejemplo, si se establece en 10, la tarea se ejecutará el décimo día de cada mes.
  5. Mes (1-12 o abreviaturas de nombres de meses): El quinto campo representa los meses del año y puede tomar valores de 1 a 12 o abreviaturas de nombres de meses (por ejemplo, en inglés: «jan» para enero, «feb» para febrero, etc.). Por ejemplo, si se establece en «3» o «mar,» la tarea se ejecutará en marzo.
  6. Días de la semana (0-7 o abreviaturas de nombres de días de la semana): El sexto campo (opcional) representa los días de la semana y puede tomar valores de 0 a 7 o abreviaturas de nombres de días de la semana (por ejemplo, en inglés: «0» o «7» para domingo, «1» o «mon» para lunes, etc.). Este campo se utiliza para especificar el día de la semana en el que debe ejecutarse la tarea.

Ejemplos de expresiones cron:

  • "0 0 * * *": Esta expresión cron ejecutará una tarea todos los días a la medianoche (00:00).
  • "0 15 10 ? * *": Esta expresión cron ejecutará una tarea a las 10:15 AM todos los días.
  • "0 0 12 * * MON-FRI": Esta expresión cron ejecutará una tarea todos los días laborables (de lunes a viernes) a las 12:00 PM.

Existe una página web que te ayuda a crear tu String de tipo «cron»: https://crontab.guru/

Atributo – fixedDelay

Indica un retraso fijo en milisegundos entre el final de la ejecución actual del método y el inicio de la próxima ejecución.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class FixedDelayScheduledTask {

    @Scheduled(fixedDelay = 5000) // Ejecuta el método cada 5 segundos después de que la ejecución anterior haya finalizado
    public void doFixedDelayTask() {
        // Código de la tarea programada
        System.out.println("Tarea programada ejecutada con un fixedDelay de 5 segundos.");
    }
}

Cada vez que se complete la ejecución del método doFixedDelayTask(), se esperarán 5 segundos antes de que se inicie la siguiente ejecución. Este patrón se repite de manera continua, lo que garantiza un retraso fijo entre las ejecuciones sucesivas de la tarea programada.

Atributo – fixedRate

Establece una tasa fija en milisegundos para la ejecución del método, lo que significa que el método se ejecutará a intervalos regulares, independientemente de cuánto tiempo llevó la ejecución anterior.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class FixedRateScheduledTask {

    @Scheduled(fixedRate = 5000) // Ejecuta el método cada 5 segundos, independientemente del tiempo de ejecución anterior
    public void doFixedRateTask() {
        // Código de la tarea programada
        System.out.println("Tarea programada ejecutada con un fixedRate de 5 segundos.");
    }
}

Independientemente de cuánto tiempo tarde la ejecución del método doFixedRateTask(), se iniciará una nueva ejecución cada 5 segundos. Esto proporciona una programación basada en una tasa fija, lo que garantiza que las tareas programadas se ejecuten a intervalos regulares y no se superpongan.

Atributo – initialDelay

Permite especificar un retraso inicial en milisegundos antes de la primera ejecución del método.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class InitialDelayScheduledTask {

    @Scheduled(fixedRate = 5000, initialDelay = 2000) // Ejecuta el método cada 5 segundos con un retraso inicial de 2 segundos
    public void doScheduledTask() {
        // Código de la tarea programada
        System.out.println("Tarea programada ejecutada con un retraso inicial de 2 segundos y un intervalo de 5 segundos.");
    }
}

Después de la primera ejecución con el retraso inicial, el método continuará ejecutándose cada 5 segundos. Esto es útil cuando necesitas un retraso antes de que se inicie la programación regular, por ejemplo, para permitir que la aplicación se inicie por completo antes de que comiencen las tareas programadas.

Atributo – zone

Define la zona horaria en la que se evaluarán las expresiones cron.

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ZoneScheduledTask {

    @Scheduled(cron = "0 0 9 * * ?", zone = "America/New_York")
    public void doScheduledTask() {
        // Código de la tarea programada
        System.out.println("Tarea programada ejecutada a las 9:00 AM en la zona horaria America/New_York.");
    }
}

El atributo zone garantiza que la expresión cron se evalúe en la zona horaria específica, lo que es útil cuando necesitas ejecutar tareas programadas en horarios locales de diferentes regiones. En este caso, la tarea se ejecutará todos los días a las 9:00 AM hora local de Nueva York.