Springboot 项目配置启用 Quantz 定时任务

原创     发表于 2020-11-19 13:51     阅读 57  
定时任务相当于闹钟,在规定的时间做规定的事情(执行脚本或者命令)

之前用SpringMVC简单体系开发项目的时候,需要手动引入Quantz依赖jar包,项目升级到Springboot,发现Springboot已经集成并实现了Quantz体系,无需二次引入,只需要通过注解的形式启用接口。需要用到的注解,主要如下:

@EnableScheduling

@EnableScheduling 注解需要配置在启动类上,旨在告诉Springboot启用时间调度服务模块,否则不生效。这里感觉有点坑,如果启动类不加@EnableScheduling 注解,项目中也可以正常配置定时任务时间表达式,但不会执行,大意的开发者可能需要花费更多的调试时间和查询资料。

@Scheduled

@Scheduled 注解为时间表达式属性配置,告诉Quantz时间调度,我需要在什么时间定时执行这个方法,用白话说就是这么简单。


代码举例

为了直观的理解,附上实现代码。启动类代码如下:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

/**
 * @desc 预泊任务调度平台启动类
 * @author HuangLongPu
 * @date 2020-10-27 11:58:52
 */
@SpringBootApplication
@EnableScheduling
public class QuantzApplication {
    public static void main(String[] args) {
        SpringApplication.run(QuantzApplication.class, args);
    }
}

新建一个Job任务处理实现类,需要加 @Component 注解,否则不能加载为 Spring Bean 实例,切记!

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

/**
 * @Author: HuangLongPu
 * @Date: 2020/11/17 14:24
 */
@Component
public class InfoHandleTask {

    /**
     * 每2分钟一次
     */
    @Scheduled(cron = "0 */2 * * * ?")
    private void remind() {
        System.out.println("每2分钟调用一次,当前时间为:" + LocalDateTime.now());
    }
}

执行结果如下:

每2分钟调用一次,当前时间为:2020-11-19T13:40:00.004
每2分钟调用一次,当前时间为:2020-11-19T13:42:00.002
每2分钟调用一次,当前时间为:2020-11-19T13:44:00.002
每2分钟调用一次,当前时间为:2020-11-19T13:46:00.001
下面内容为开发者注意的点,需理解

细心的开发者应该会发现,设置的定时任务是每2分钟执行一次,打印出来的结果确实是2分钟,但是没有秒!经过大量测试发现,任务是在时间基础上每2分钟的整数倍基点0秒时准时执行,包括小时、秒也是一样的原来(如果只是配置每多少小时或者每多少秒执行一次的任务),这个点需要开发者掌握并理解,以免发生业务上的BUG。


时间表达式说明

@Scheduled 注解提供了好几个注入时间表达式的属性,建议用 cron 属性,毕竟 cron 支持的时间表达式和类 Linux 服务器定时任务的表达式是兼容共通的。下面附上相应的 cron 表达式,供参考:

0 * * * * ? 每一分钟触发一次
0 0 * * * ? 每一小时触发一次
0 0 10 * * ? 每10点触发一次
0 * 14 * * ?每天下午2点到2点59分期间,每一分钟触发
0 30 9 1 * ? 每月一号上午9点30分触发
0 15 10 15 * ?每月15号上午10点15分触发

*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点

0 0 12 ? * WED 表示每个星期三中午12点
0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五点
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发

0 0 23 L * ? 每月最后一天23点执行一次
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发0 0/5 10-22 * * ? 每天从早上10点晚上22点,每5分钟执行一次

上面列举出来的 cron 时间表达式已经涵盖了大多数场景,基本满足日常开发需要,特殊场景时间表达式需额外查阅资料。