Explicación detallada de las tareas de temporización de springboot


En el proceso de desarrollo de nuestro proyecto, a menudo necesitamos tareas cronometradas para ayudarnos a hacer algún contenido. Spring Boot ya lo ha implementado por defecto, y solo necesitamos agregar las anotaciones correspondientes para lograrlo.

1. Basado en anotaciones (estático)

1. Agregar dependencias

  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
  </dependency>
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
  </dependency>

2. Crea una tarea programada

Tarea de tiempo 1:

@Configuration
@EnableScheduling
public class SchedulerTask1 {
    
    

    private int count=0;

    @Scheduled(cron="*/6 * * * * ?")
    private void process(){
    
    
        System.out.println("this is scheduler task runing  "+(count++));
    }

}

Tarea cronometrada 2:

@Configuration
@EnableScheduling
public class SchedulerTask2 {
    
    

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 6000)
    public void reportCurrentTime() {
    
    
        System.out.println("现在时间:" + dateFormat.format(new Date()));
    }

}

El resultado es el siguiente:

this is scheduler task runing  0
现在时间:09:44:17
this is scheduler task runing  1
现在时间:09:44:23
this is scheduler task runing  2
现在时间:09:44:29
this is scheduler task runing  3
现在时间:09:44:35

3. Descripción del parámetro

@ConfigurationSe utiliza para marcar la clase de configuración y tiene el efecto de Componente.

@EnableSchedulingIndica que la tarea programada está habilitada

@ScheduledEl parámetro puede aceptar dos configuraciones de tiempo, una es nuestra común cron="*/6 * * * * ?"y la otra es fixedRate = 6000que ambas significan imprimir el contenido cada seis segundos.

tasa fija Descripción

  • @Scheduled(fixedRate = 6000): Ejecutar de nuevo 6 segundos después del último punto de tiempo de ejecución

  • @Scheduled(fixedDelay = 6000): Ejecutar de nuevo 6 segundos después del último punto de tiempo de ejecución

  • @Scheduled(initialDelay=1000, fixedRate=6000): Ejecutar después del primer retraso de 1 segundo, luego ejecutar cada 6 segundos de acuerdo con la regla de tasa fija

El atributo cron especifica las reglas de ejecución de la tarea en forma de expresiones y también inicia el tiempo desde la finalización de la última ejecución de la tarea. Las reglas de expresión son las siguientes:

Las reglas para cada lugar son las siguientes:

inserte la descripción de la imagen aquí

Observación:

  • Asterisco (*): Se puede utilizar en todos los campos para indicar cada momento en el campo de tiempo correspondiente, por ejemplo, * en el campo de minutos significa "cada minuto".
  • Signo de interrogación (?): este carácter solo se usa en los campos de fecha y semana, y generalmente se designa como un "valor sin sentido", que es equivalente a un marcador de posición.
  • Signo menos (-): expresa un rango, como usar "10-12" en el campo de la hora, significa de 10 a 12 en punto, es decir, 10,11,12.
  • Coma (,): expresa un valor de lista, como usar "MON, WED, FRI" en el campo de la semana, significa lunes, miércoles y viernes.
  • Barra oblicua (/): x/y expresa una secuencia de pasos iguales, x es el valor inicial e y es el valor del paso incremental. Si usa 0/15 en el campo de segundos, significa 0, 15, 30 y 45 segundos, y 5/15 significa 5, 20, 35, 50 en el campo de minutos, también puede usar */y, que es equivalente a 0/a.
  • L: Este carácter solo se usa en los campos de fecha y semana, representando el significado de "Último", pero tiene diferentes significados en los dos campos. L en el campo de fecha significa el último día del mes, como el 31 de enero y el 28 de febrero en un año no bisiesto; si se usa L en medio de la semana, significa sábado, lo que equivale a 7. Sin embargo, si L aparece en el campo del día de la semana y está precedido por una X numérica, significa "los últimos X días del mes", por ejemplo, 6L significa el último viernes del mes.
  • W: Este carácter solo puede aparecer en el campo de fecha, y es una modificación de la fecha principal, indicando el día hábil más cercano a la fecha. Por ejemplo, 15W significa el día laborable más cercano al día 15 del mes. Si el día 15 del mes es sábado, coincida con el viernes 14; si el 15 es domingo, coincida con el lunes 16; si el 15 es martes, el resultado es 15 No. Martes. Pero debe tenerse en cuenta que la fecha de coincidencia asociada no puede abarcar meses. Por ejemplo, si especifica 1W, si el 1 es sábado, el resultado coincidirá con el lunes 3, no con el último día del mes anterior. Una cadena W solo puede especificar una sola fecha, no un rango de fechas.
  • Combinación LW: LW se puede combinar en el campo de fecha, lo que significa el último día hábil del mes actual.
  • Signo de almohadilla (#): este carácter solo se puede utilizar en el campo de la semana, indicando un determinado día laborable del mes. Por ejemplo, 6#3 significa el tercer viernes del mes actual (6 significa viernes, #3 significa el tercero actual) y 4#5 significa el quinto miércoles del mes actual, suponiendo que no haya un quinto miércoles en el mes actual. , ignorar y no activar.
  • C: Este carácter solo se usa en los campos de fecha y semana, representando el significado de "Calendario". Significa la fecha asociada al plan, si la fecha no está asociada, es equivalente a todas las fechas del calendario. Por ejemplo, 5C en el campo de fecha es equivalente al primer día después del 5 del calendario. 1C es equivalente al primer día después del domingo en el campo del día de la semana.
  • Las expresiones cron no distinguen entre mayúsculas y minúsculas.

2. Basado en interfaz (dinámico)

1. Agregar dependencias

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.1</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
</dependency>

2. Agregar registros de base de datos

Abra la base de datos local mysql, abra la ventana de consulta casualmente y luego ejecute el contenido del script, de la siguiente manera:

DROP DATABASE IF EXISTS `socks`;
CREATE DATABASE `socks`;
USE `SOCKS`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron`  (
  `cron_id` varchar(30) NOT NULL PRIMARY KEY,
  `cron` varchar(30) NOT NULL  
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

inserte la descripción de la imagen aquí

Luego agregue la fuente de datos en el archivo application.properties

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/socks?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

3. Crea un temporizador

Una vez que la base de datos está lista para los datos, escribimos una tarea programada. Tenga en cuenta que TriggerTask se agrega aquí. El propósito es leer el ciclo de ejecución que configuramos en la base de datos y ejecutar el contenido de las tareas programadas relacionadas.
El código específico es el siguiente:

@Configuration      //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling   // 2.开启定时任务
public class DynamicScheduleTask implements SchedulingConfigurer {
    
    

    @Autowired
    private CronMapper cronMapper;

    /**
     * 执行定时任务.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    
    

        taskRegistrar.addTriggerTask(
                //1.添加任务内容(Runnable)
                () -> System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime()),
                //2.设置执行周期(Trigger)
                triggerContext -> {
    
    
                    //2.1 从数据库获取执行周期
                    String cron = cronMapper.selectByPrimaryKey("1").getCron();
                    //2.2 合法性校验.
                    if (StringUtils.isEmpty(cron)) {
    
    
                        // Omitted Code ..
                    }
                    //2.3 返回执行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

}

4. Iniciar la prueba

Luego abra Navicat, modifique el ciclo de ejecución para que se ejecute cada 10 segundos, verifique la consola y descubra que el ciclo de ejecución ha cambiado y no necesitamos reiniciar la aplicación, lo cual es muy conveniente. Como se muestra en la imagen:

inserte la descripción de la imagen aquí

3. Cuarzo

Quartz es otro proyecto de código abierto de la organización de código abierto OpenSymphony en el campo de la programación de trabajos. Puede combinarse con aplicaciones J2EE y J2SE o usarse solo. Quartz se puede utilizar para crear programas simples o complejos que ejecutan diez, cientos o incluso decenas de miles de trabajos.

1. Agregar dependencias

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

2. Escribir clase de tarea

package com.cn.service;
 
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class MyQuartz extends QuartzJobBean {
    
    
 
    private final Logger log = LoggerFactory.getLogger(MyQuartz.class);
 
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
    
    
        log.info("hello quartz");
    }
 
}

3. Clase de configuración de escritura

package com.cn.config;

import com.cn.service.MyQuartz;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
public class QuartzConfig {
    
    
 
    @Bean
    public JobDetail myQuartz() {
    
    
        return JobBuilder.newJob(MyQuartz.class).withIdentity("MyQuartz").storeDurably().build();
    }
 
    @Bean
    public Trigger studentRankQuartzTrigger() {
    
    
        return TriggerBuilder.newTrigger().forJob(myQuartz())
                .withIdentity("MyQuartz")
                .withSchedule(DailyTimeIntervalScheduleBuilder.dailyTimeIntervalSchedule().withInterval(5,		
                 DateBuilder.IntervalUnit.SECOND))
                .build();
    }
}

4. Iniciar el proyecto

Imprime "hola cuarzo" cada 5 segundos

inserte la descripción de la imagen aquí

Supongo que te gusta

Origin blog.csdn.net/jiang_wang01/article/details/131466258
Recomendado
Clasificación