程序员社区

Spring Boot 配置定时任务

引言

       项目开发中经常需要执行一些定时任务,比如:需要在每天凌晨时候,分析一次前一天的日志信息。Spring为我们提供了异步执行任务调度的方式,提供 TaskExecutor 、TaskScheduler 接口。Spring Boot 项目,我们要开启一个定时任务,需要如下两步走:

  1. 项目中会用到 @EnableScheduling@Scheduled 两个注解。
  2. 需要我们来编写一个 cron 表达式来指定任务执行规则。

1.注解的使用

  ①需要在项目启动类上标注 @EnableScheduling 注解

@EnableScheduling //开启基于注解的定时任务
@SpringBootApplication
public class Springboot04TaskApplication {
   

    public static void main(String[] args) {
   
        SpringApplication.run(Springboot04TaskApplication.class, args);
    }
}

  ②在具体的业务执行方法上标注 @Scheduled注解

@Service
public class xxxService{
   

    @Scheduled(cron = "0/4 * * * * MON-SAT")
    public void xxxMethod(){
   
        //此处为具体业务逻辑方法
        System.out.println("业务逻辑方法");
    }
}

2.cron 表达式介绍

       我们可以通过编写 cron 表达式来指定定时任务执行的规则。cron 表达式由 7 个部分组成,各部分之间用空格隔开,Cron表达式的7个部分从左到右代表的含义如下:

秒(second) 分(minute) 时(hour) 日(day of month) 月(month) 星期(day of week) 年(year)

Ⅰ.各字段含义

字段 允许值 允许的特殊字符
秒(second) 0-59的整数 , - * /
分(minute) 0-59的整数 , - * /
时(hour) 0-23的整数 , - * /
日(day of month) 1 ~ 31的整数(但是你需要考虑你月的天数) , - * ? / L W C
月(month) 1-12的整数( 或者JAN-DEC) , - * /
星期(day of week) 1-7的整数( 或者MON-SUN)(1代表星期日) , - * ? / L W C
年(year) 1970 ~ 2099(该字段为可选字段) , - * /

Ⅱ.特殊字符代表含义

特殊字符 代表含义
, 枚举
- 区间
* 任意
/ 步长
? 日&星期冲突时匹配解决方案
L 最后
W 工作日
C 和calendar联系后计算过的值
# 星期。eg:4#2,表示第2个星期4

提示:星期和日不能同时为 * 。必须一个是*,另一个就是?。否则会报Support for specifying both a day-of-week AND a day-of-month parameter is not implemented.错误。

Ⅲ.常用 cron 表达式介绍

cron表达式 表达式代表含义
0 0/5 14,18 * * ? 每天14点整,和18点整,每隔5分钟执行一次
0 15 10 ? * 1-6 每个月的周一至周六10:15分执行一次
0 0 2 ? * 6L 每个月的最后一个周六凌晨2点执行一次
0 0 2 LW * ? 每个月的最后一个工作日凌晨2点执行一次
0 0 2-4 ? * 1#1 每个月的第一个周一凌晨2点到4点期间,每个整点都执行一次
0/4 * * * * MON-SAT 周一到周六,每4秒执行一次
0,1,2 * * * * MON-SAT 周一到周六,每分钟的 0,1,2 秒执行一次
0 0 2 1 * ? * 表示在每月的1日的凌晨2点执行一次
0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行一次
0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点
0 0 12 * * ? 每天中午12点触发
0 15 10 ? * * 每天上午10:15触发
0 15 10 * * ? 每天上午10:15触发
0 15 10 * * ? * 每天上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 15 10 15 * ? 每月15日上午10:15触发
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发

你也可以搜索一下,网上有提供自定义 cron 表达式的工具类。

  1. 在线 cron 表达式生成器(1)
  2. 在线 cron 表达式生成器(2)

以上两步完成,Spring Boot 定时任务则配置OK

如果本文对你有所帮助,那就给我点个赞呗

End

赞(0) 打赏
未经允许不得转载:IDEA激活码 » Spring Boot 配置定时任务

一个分享Java & Python知识的社区