Bootstrap

SpringBoot 整合定时任务 Quartz、SpringBoot 内置定时任务 Task 代码详解

概念介绍
  • 什么是定时任务:
    定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表,年度报表、统计报告等都可以用定时任务来实现。

  • 流行的定时任务技术:
    1、quartz
    2、Spring Task

  • 相关概念介绍:
    1、工作(Job):用于定义具体执行的工作。
    2、工作明细(JobDetail):用于描述定时工作相关的信息。
    3、触发器(Trigger):用于描述触发工作的规则,通常使用 cron 表达式定义调度规则。
    4、调度器(Scheduler):描述了工作明细与触发器的对应关系,简单说是执行频度。

- 通过 Java 来实现定时任务:
import java.util.Timer;
import java.util.TimerTask;

public class TestTimerTask {

    // 通过java的方式实现定时任务
    public static void main(String[] args) {
        Timer timer = new Timer();
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("--------:定时任务执行了");
            }
        };
        // 2000ms执行一次run(), 延迟为0
        timer.schedule(timerTask, 0, 2000);
    }

}
SpringBoot 整合 Quartz
- 引入相关依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
- 定义Job:MyQuartz.java
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

public class MyQuartz extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        System.out.println("SpringBoot 整合 Quartz 的任务执行了...");
    }
}
- 通过配置类的形式将工作明细和触发器注册为Bean:
import com.example.springboot.quartz.MyQuartz;
import org.quartz.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class QuartzConfig {

    @Bean
    // 定义工作明细
    public JobDetail myJobDetail(){

        return JobBuilder
                .newJob(MyQuartz.class)
                .storeDurably()
                .build();
    }

    @Bean
    // 定义触发器
    public Trigger myJobTrigger(){
    	// 定义调度器 schedBuilder
        // cronSchedule()参数依次为:秒、分钟、小时、日、月、星期
        // 如下表示,任意月份的任意天的每小时每分钟的每20秒执行一次
        ScheduleBuilder schedBuilder = CronScheduleBuilder.cronSchedule("0/20 * * * * ?");
        
        return TriggerBuilder
                .newTrigger().
                forJob(myJobDetail())
                .withSchedule(schedBuilder)
                .build();
    }

}
- 执行效果:

在这里插入图片描述

SpringBoot 内置定时任务 Task
- 主启动类开启定时任务开关:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
// SpringBoot Task 开启定时任务开关
@EnableScheduling
public class SpringBootTaskApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringBootTaskApplication.class, args);

    }

}
- 配置 yml:
spring:
  task:
    scheduling:
      # 任务调度线程池大小,默认为1
      pool:
        size: 1
      thread-name-prefix: test_
      shutdown:
        # 线程池关闭时等待所有任务完成
        await-termination: false
        # 调度线程关闭前最大等待时间,确保最后一定关闭
        await-termination-period: 10s
- 定义任务类:MyTask.java
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyTask {

	// 每月每日每小时每分钟每20秒执行一次
	// @Scheduled 用于设定具体的任务执行的频度
    @Scheduled(cron = "0/20 * * * * ?")
    public void testMyTask(){
        System.out.println("SpringBoot Task 定时任务执行了...");
    }

}
- 执行结果:

在这里插入图片描述

;