SpringBoot自带定时器功能,若不考虑重复启动定时任务以及并发带来的问题,可以选择这种方式来简单快速地定义定时器。
使用时只需要在声明定时任务的类或者启动类上添加注解@EnableScheduling配合使用在方法上的@Scheduled注解就能简单定义一个定时任务
在启动类上加@EnableScheduling可以方便对所有任务进行开启和关闭
在声明定时任务的类上需要加@Component将该类实例化到Spring容器中,才能被扫描到类里的定时任务。
在方法上添加@Scheduled注解添加参数设置定时策略,有两种设置方式
这种方式适合不指定特定时间,间歇一段时间就执行一次的情况,功能较弱。
可以指定什么时候触发、多久触发一次等,功能较强大,需要使用特定的表达式。
两种方式使用如下:
@Component
@Slf4j
public class MyScheduledTask {
@Scheduled(fixedRate = 1000 * 5)
public void bootSchedule(){
log.info("SpringBoot自带定时器fixedRate5s启动:{}",LocalDateTime.now());
}
@Scheduled(cron = "10/10 * * * * ?")
public void bootScheduleCron(){
log.info("SpringBoot自带Cron定时器fixedRate10s启动:{}", LocalDateTime.now().toString());
}
}
运行效果如下
为什么上面的5条中,5秒运行一次的任务连续执行了4次而10秒的任务没有运行呢?
原因是,当50秒时,运行10秒后进入到下一分钟的范围,而该任务指定从每分钟的第10秒开始运行,所以这次不会调用该任务。
cron表达式有6或7个域,中间以逗号分隔,理解也比较简单,每个域顺序表示的意义如下
每个符号的含义
注意:每周的第一天是周日
情景测试,我想让一个任务在2019到2020年每月的第3个周三的晚上6点的第20分开始,每5分钟的第30秒执行一次
30 20/5 18 ? * 4#3 2019-2020