引言
项目开发中经常需要执行一些定时任务,比如:需要在每天凌晨时候,分析一次前一天的日志信息。Spring为我们提供了异步执行任务调度的方式,提供 TaskExecutor 、TaskScheduler 接口。Spring Boot 项目,我们要开启一个定时任务,需要如下两步走:
- 项目中会用到
@EnableScheduling
、@Scheduled
两个注解。 - 需要我们来编写一个
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 表达式的工具类。
以上两步完成,Spring Boot 定时任务则配置OK
如果本文对你有所帮助,那就给我点个赞呗
End