实现指南
几个简单的注解,轻松搞定 SpringBoot 的定时任务
创建一个用于执行定时任务的类并在类上添加以下三个注解
- @Component 加入IOC容器
- @Configuration 设置为配置类
- @EnableScheduling 开启定时任务,声明使用 scheduled
类中创建执行定时任务的方法并在方法上添加注解
- @Scheduled
@Scheduled 注解被ScheduledAnnotationBeanPostProcessor 类所拦截
SpringBoot使用 @scheduled 定时任务,执行的时候是在一个单线程中,如果前一个任务执行时间过长,则有可能会导致其他后续任务被阻塞,直到该任务执行完成。
此处推荐学习一下cron表达式的使用: https://www.matools.com/cron
案例
/**
* @Author zqc
* @Date 2020/9/29-13:59
* @Description 定时任务类
* 任务的类上写:
* @Component 加入IOC容器
* @Configuration 设置为配置类
* @EnableScheduling 开启定时任务
*
* 任务方法上写@Scheduled
*/
@Component
@Configuration
@EnableScheduling
public class Jobs {
/**
* 单位是毫秒
* fixedRate是每多次分钟一次,不论业务执行花费了多少时间,都是1分钟执行1次,
* fixedDelay是当任务执行完毕后1分钟在执行
*/
//表示方法执行完成后5000毫秒
@Scheduled(fixedDelay = 5000)
public void fixedDelayJob() throws InterruptedException {
System.out.println("fixedDelay 每隔5秒" + new Date());
}
//表示每隔3000毫秒
@Scheduled(fixedRate = 3000)
public void fixedRateJob() {
System.out.println("fixedRate 每隔3秒" + new Date());
}
/**
* cron生成器: https://www.matools.com/cron
* cron 共7位, 秒 分 时 日 月 星期 年
* 第一位,表示秒,取值0-59
* 第二位,表示分,取值0-59
* 第三位,表示小时,取值0-23
* 第四位,日期天/日,取值1-31
* 第五位,日期月份,取值1-12
* 第六位,星期,取值1-7,星期天,星期一...,注:不是第一周,第二周的意思;另外:1表示星期天,2表示星期一
* 第七位,年份,可以留空,取值1970-2099
*
* (*)星号:可以理解为每的意思,每秒,每分,每天,每月,每年...
* (?)问号:问号只能出现在日期和星期这两个位置。
* (-)减号:表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12
* (,)逗号:表达一个列表值,如在星期字段中使用“1,2,4”,则表示星期一,星期二,星期四
* (/)斜杠:如:x/y,x是开始值,y是步长,比如在第一位(秒) 0/15就是,从0秒开始,每15秒,最后就是0,15,30,45,60
*/
//每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
@Scheduled(cron = "0 0/5 14,18 * * ?")
public void cronJob() {
System.out.println("每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发:"+new Date());
}
//每天下午2点到下午2:55期间的每5分钟触发
@Scheduled(cron = "0 0/5 14 * * ?")
public void cronJobOneHour() {
System.out.println("每天下午2点到下午2:55期间的每5分钟触发:"+new Date());
}
//表示每5分钟执行一次,是整点的5分钟,不是程序启动后开始计算的每5分钟
@Scheduled(cron = "0 0/5 * * * ?")
public void cronJob5Minutes() {
System.out.println("每5分钟执行一次:"+new Date());
}
}
cron 表达式配在 application.yml 中
#application.yml中的配置
scheduled:
cron: * 0/5 * * * ?
@Scheduled 中获取这个配置
@Scheduled(cron = "${scheduled.cron}")
推荐阅读
- @Scheduled注解各参数详解:
https://www.jianshu.com/p/1defb0f22ed1 - 动态控制 Spring Boot 中的 @Scheduled 定时任务:
https://segmentfault.com/a/1190000018805591 - @Scheduled的实现原理:
https://www.jianshu.com/p/9a0927fbd4ad