前言

定时任务的业务场景: 1、定时去刷新某个订单的业务状态(下完订单后一直没有付款,15分钟之后,把订单状态置为无效)2、对接微信公众号,每隔2个小时去微信服务器上刷新token。 类似这样的需求,我们就可以使用定时任务来完成

如何实现

1、在启动类上开启定时任务的支持

@EnableScheduling

2、创建定时任务:创建一个任务类,并注册到spring,配置执行的时间

@Component
@Slf4j
public class TokenTask {

    @Scheduled(fixedRate = 3000)
    public void getToken(){
        log.info("定时获取token");
    }
}

3、@Scheduled 配置

@Scheduled(fixedRate=3000):上一次开始执行时间点后3秒再次执行;
@Scheduled(fixedDelay=3000):上一次执行完毕时间点3秒再次执行;
@Scheduled(initialDelay=1000, fixedDelay=3000):第一次延迟1秒执行,然后在上一次执行完毕时间点3秒再次执行;
@Scheduled(cron="* * * * * ?"):按cron规则执行,指定任务在特定时间执行;

4、 cron一定有七位数,最后一位是年,SpringBoot定时方案只需要设置六位即可:

第一位, 表示秒, 取值是0 ~ 59
第二位, 表示分. 取值是0 ~ 59
第三位, 表示小时, 取值是0 ~ 23
第四位, 表示天/日, 取值是0 ~ 31
第五位, 表示月份, 取值是1 ~ 12
第六位, 表示星期, 取值是1 ~ 7, 星期一,星期二..., 还有 1 表示星期日
第七位, 年份, 可以留空, 取值是1970 ~ 2099

cron中,还有一些特殊的符号,含义如下:
(*) 星号,可以理解为每的意思,每秒、每分、每天、每月、每年...。
(?)问号,问号只能出现在日期和星期这两个位置,表示这个位置的值不确定,每天 3 点执行,因此第六位星期的位置,是不需要关注的,就是不确定的值;同时,日期和星期是两个相互排斥的元素,通过问号来表明不指定值,比如 1 月 10 日是星期一,如果在星期的位置另指定星期二,就前后冲突矛盾了。
(-)减号,表达一个范围,如在小时字段中使用“10 - 12”,则表示从 10 到 12 点,即 10、11、12。
(,)逗号,表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一、星期二、星期四。
(/)斜杠,如 x/y,x 是开始值,y 是步长,比如在第一位(秒),0/15 就是从 0 秒开始,每隔 15 秒执行一次,最后就是 0、15、30、45、60,另 */y,等同于 0/y。

5、一些完整的Cron表示式的示例

"*/5 * * * * ? " 每隔5秒执行一次
"0 */1 * * * ? " 每隔1分钟执行一次
"0 0 12 * * ?" 每天中午十二点触发
"0 0 23 * * ?" 每天23点执行一次
"0 0 1 * * ?" 每天凌晨1点执行一次
"0 0 1 1 * ?" 每月1号凌晨1点执行一次
"0 0 23 L * ?" 每月最后一天23点执行一次
"0 0 1 ? * L" 每周星期天凌晨1点实行一次
"0 26,29,33 * * * ?" 在26分、29分、33分执行一次
"0 0 0,13,18,21 * * ?" 每天的0点、13点、18点、21点都执行一次
"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分每分钟一次触发
"0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发
"0 0/5 14,18 * * ?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发
"0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发
"0 10,44 14 ? 3 WED" 三月的每周三的14:10和14:44触发
"0 15 10 ? * MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发