Compartir tecnología

SpringBoot diario: la implementación @Scheduled se ejecuta una vez cuando se inicia el servicio

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina


Hablando de tareas programadas, deberíamos pensar en @Scheduled, Quartz y XXL-JOB. Sin embargo, algunos servicios individuales o proyectos pequeños pueden usar @Scheduled directamente para implementar tareas asincrónicas por conveniencia y velocidad. Por lo tanto, se amplían los requisitos temáticos de este artículo.

Cuando se usa @Scheduled en un proyecto, ¿cómo se puede ejecutar la tarea asincrónica especificada por adelantado cuando se inicia el proyecto?

1. Explicación detallada de @Scheduled

La anotación @Scheduled admite múltiples parámetros para controlar de manera flexible el tiempo de ejecución de la tarea.

  • cron: expresión cron, que puede controlar con precisión segundos, minutos, horas, días, meses, semanas, etc.
    Insertar descripción de la imagen aquí
  • zona: recibe una zona horaria, como Asia/Shanghai, la zona horaria que usamos generalmente. Normalmente dejamos este campo en blanco.
  • fixDelay: cuánto tiempo después del tiempo de finalización de la última ejecución se ejecutará nuevamente. Como @Scheduled(fixedDelay = 5000)
  • fixDelayString: tiene el mismo significado que fixDelay, pero en forma de cadena. La única diferencia es que admite marcadores de posición, como @Scheduled(fixedDelayString = "5000")
  • fixRate: cuánto tiempo transcurre desde el último inicio del tiempo de ejecución, como @Scheduled(fixedRate = 5000)
  • fixRateString: tiene el mismo significado que fixRate, pero en forma de cadena. La única diferencia es que se admiten marcadores de posición.
  • inicialDelay: cuánto tiempo retrasar la ejecución por primera vez. Por ejemplo, se ejecutará después del primer retraso de 1 segundo. Luego se ejecutará cada 5 segundos de acuerdo con la regla de tasa fija @Scheduled (initialDelay = 1000, tasa fija =). 5000)
  • inicialDelayString: tiene el mismo significado que inicialDelayString, pero en forma de cadena. La única diferencia es que se admiten marcadores de posición.

2. Implementación lógica

1. Cree un método de lógica de tarea programada

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class ScheduledTest {

    @Scheduled(cron = "* 1 * * * ?")
    public void task1() throws Exception{
        System.out.println("task1 执行: " + Thread.currentThread() + "-" + DateTime.now());
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

2. Cree una nueva clase de ejecución de inicio.

Esta clase llama principalmente al método de tarea especificado manualmente al inicio.

/**
 * @Author 码至终章
 * @Version 1.0
 */
@Component
public class StartupTasks {

    private final ScheduledTest scheduledTasks;

    public StartupTasks(ScheduledTest scheduledTasks) {
        this.scheduledTasks = scheduledTasks;
    }

    @PostConstruct
    public void startUp() {
        try {
            System.out.println("服务启动执行任务");
            scheduledTasks.task1();
        }catch (Exception e){
			e.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

Nota: Recuerde agregar @EnableScheduling a la clase de inicio para que se ejecute la tarea programada. Por supuesto, esto no afecta la prueba lógica de este artículo.

3. Resultados de la prueba

Después de que comience el servicio, vea la información de impresión
Insertar descripción de la imagen aquí