简介:
实现定时任务的方式很多,基于JDK的Timer、Quartz等等,本章介绍 SpringBoot1.5 中Spring Task实现定时任务,非常方便。
项目构建:
springboot web项目构建完就默认内置了@Scheduled 定时任务。
1、开启定时支持,在启动类上添加注解@EnableScheduling
// mapper 接口类扫描包配置
@MapperScan("com.coolron.*.dao")
@SpringBootApplication
// 开启定时支持
@EnableScheduling
public class SpringbootApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootApplication.class, args);
}
}
2、定时任务
2.1、@Scheduled 的四个属性
在线 cron 表达式生成器:http://cron.qqe2.com/
1、cron属性:
指定具体的时间点,cron表达式可以完成任意的时间搭配,必须六或七个域,中间使用空格隔开,
从前完后依次为:秒(1-59)、分(1-59)、时(1-23)、日(1-31)、月(1-12)、星期(1-7)、年(~2099)
特殊字符:
*:匹配该域的任意值
-:表示范围,例如:0 0 9-17 * * * 每天朝九晚五时间内的0分0秒触发
/: 时间间隔,例如:5/10 * * * * * 每一分钟的5秒、15秒、25秒... 触发
,:枚举值, 例如:0 0 9,18 * * ? 在每天9点和下午6点整触发
: 任意值,只能用到日、星期两个域 注意星期和日这两个域的冲突
例子:
#:0 0 12 * * ? 每天中午12点触发
#:0 0/5 8 * * ? 每天8点到8:55期间的每5分钟触发
#:0 0-10 20 * * ? 每天20点到20:10期间的每1分钟触发
2、fixedRate属性:
时间间隔 上一次调用开始后再次调用的间隔
3、fixedDelay属性:
时间间隔 上一次调用完成后再次调用的间隔
4、initialDelay属性:
只是做第一次执行前的延时 配合 fixedDelay 和 fixedRate 使用
2.2、创建定时任务
/**
* @Auther: xf
* @Date: 2018/11/25 14:01
* @Description: 定时任务
*/
@Slf4j
@Component
public class MyTask {
/**
* 指定具体的时间点去执行
* 效果:具体时间点的 10秒 20秒 30秒... 执行
*/
@Scheduled(cron = "0/10 * * * * ?")
private void cornTest() {
log.info(">>>>>corn 执行时间:{}", new Date());
}
/**
* 上一次调用开始后再次调用的间隔
* 效果:第一次调用开始 5 秒调用第二次 不管前一次是否调用完成
*/
//@Scheduled(fixedRate = 1000 * 5)
private void fixedRateTest() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(">>>>>fixedRate 执行时间:{}", new Date());
}
/**
* 上一次调用完成后再次调用的间隔
* 效果:第一次调用完 5 秒之后调用第二次
*/
// @Scheduled(fixedDelay = 1000 * 5)
private void fixedDelayTest() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(">>>>>fixedDelay 执行时间:{}", new Date());
}
/**
* initialDelay 只是做第一次执行前的延时 配合 fixedDelay 和 fixedRate 使用
* 效果: 第一次执行之前延时 5 秒
*/
//@Scheduled(initialDelay = 1000 * 5, fixedDelay = 1000 * 2)
//@Scheduled(initialDelay = 1000 * 5, fixedDelay = 1000 * 2)
private void initialDelayTest() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info(">>>>>initialDelay 执行时间:{}", new Date());
}
}
3、测试:启动项目即可看到对应效果
总结:
@Scheduled 定时任务使用较多的是 cron 和 fixedDelay 属性,fixedRate 是从上一次调用开始后计时,不管上一个任务是否完成,这样容易产生重复操作,慎用。这里的调度使用的是同一个线程,建议另外开线程执行,多线程将在后面章节涉及。
个人学习分享
更多 springboot、springcloud、docker 文章关注微信公众号吧: