下面使用 Spring 的 @Scheduled 注解实现定时任务
[TOC]
环境/版本一览:
- 开发工具:Intellij IDEA 2018.2.2
- springboot: 2.0.6.RELEASE
- jdk:1.8.0_171
- maven:3.3.9
1、pom.xml
1 | <dependencies> |
2、component
1 | package com.fatal.component; |
3、Application
1 | package com.fatal; |
4、显示
笔记
@Scheduled详解
在上面的入门例子中,使用了@Scheduled(fixedRate = 5000)
注解来定义每过5秒执行的任务,对于@Scheduled
的使用可以总结如下几种方式:
@Scheduled(fixedRate = 5000)
:上一次开始执行时间点之后5秒再执行@Scheduled(fixedDelay = 5000)
:上一次执行完毕时间点之后5秒再执行@Scheduled(initialDelay=1000, fixedRate=5000)
:第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次@Scheduled(cron="*/5 * * * * *")
:通过cron表达式定义规则
Cron 表达式
1. 介绍
cron 的表达式是字符串,实际上是由 七个子表达式 构成,描述个别细节的时间表。这些子表达式是分开的空白,代表:
序号 | 名字 | 描述(每一个表达式都有一套可以指定有效值) |
---|---|---|
1 | Seconds | 可以用数字 0-59 表示 |
2 | Minutes | 可以用数字 0-59 表示 |
3 | Hours | 可以用数字 0 - 23 表 |
4 | Day-of-Month | 可以用数字 1-31 中的任一一个值,但要注意一些特别的月份 |
5 | Month | 可以用 0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示 |
6 | Day-of-Week | 可以用数字 1 - 7 表示(1 = 星期日)或用字符口串 “SUN, MON, TUE, WED, THU, FRI and SAT” 表示 |
7 | Year (可选字段) | 可以用数字 1977-2099 表示 |
例 :”0 0 12 ? * WED” 在每星期三下午12:00 执行
析:个别子表达式可以包含 范围,例如,在前面的例子里(“WED”)可以替换成 “MON-FRI”, “MON, WED, FRI”甚至“MON-WED,SAT”.
2. 特殊字符
字符 | 描述 |
---|---|
* | 代表整个时间段. |
/ | 表示为“每”。如“0/15”表示每隔15分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次,“3”表示从第3分钟开始执行 |
? | 表示每月的某一天,或每周的某一天 |
L | 用于每月,或每周,表示为每月的最后一天,或每个月的最后星期几。如“6L”放在Day-of-Week上,表示“每月的最后一个星期五”(6:每月的周五;L:在这里代表最后一周) |
W | 表示为最近工作日,如“15W”放在每月(day-of-month)字段上表示为“到本月15日最近的工作日” |
# | 是用来指定“的”每月第n个工作日,例 在每周(day-of-week)这个字段中内容为”6#3” or “FRI#3” 则表示“每月第三个星期五” |
, 逗号 | 分隔表达式中的数值 |
- 横杆 | 用在两个数值中间表示 范围 |
3. 格式
名字 | 允许的值 | 允许的值 |
---|---|---|
秒 | 0-59 | , - * / |
分 | 0-59 | , - * / |
小时 | 0-23 | , - * ? / L W C |
日 | 1-31 | , - * / |
月 | 1-12 or JAN-DEC | , - * ? / L C # |
周 | 1-7 or SUN-SAT | , - * / |
年 (可选字段) | empty,1970-2099 | , - * / |
4. 示例
每隔5秒执行一次:/5 * ?
每隔1分钟执行一次:0 /1 ?
- 每天23点执行一次:0 0 23 ?
- 每天凌晨1点执行一次:0 0 1 ?
- 每月1号凌晨1点执行一次:0 0 1 1 * ?
- 每月最后一天23点执行一次:0 0 23 L * ?
- 每周星期天凌晨1点实行一次:0 0 1 ? * L
- 在26分、29分、33分执行一次:0 26,29,33 * ?
- 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 ?
参考资料
Spring Boot中使用@Scheduled创建定时任务
总结
在 SpringBoot 中使用 Spring 注解 @Scheduled 注解实现定时任务很简单,只需两步:
- 在配置类上加 @EnableScheduling(开启定时任务功能)
- 在定时方法上加 @Scheduled
SpringBoot
的知识已经有前辈在我们之前探索了。比较喜欢的博主有:唐亚峰 | Battcn、方志朋的专栏、程序猿DD、纯洁的微笑。对这门技术感兴趣的可以去他们的博客逛逛。谢谢他们的分享~~
以上文章是我用来学习的Demo
,都是基于 SpringBoot2.x
版本。
源码地址: https://github.com/ynfatal/springboot2-learning/tree/master/chapter21