SpringBoot自带的 Schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多
以下任务都是在单线程下执行的
第一步 创建SpringBoot项目
第二步 添加@EnableScheduling开启定时任务
第三步 设置定时需要执行的任务
有两种方法设置执行时机
第一种我们就且叫他为普通方法
1.fixedRate:会为所有任务的开始执行时间编排一个表,假如fixedRate=5000,且第一次开始时间是10:00:00
任务 开始执行时间
任务1 10:00:00
任务2 10:00:05
任务3 10:00:10
任务4 10:00:15
任务5 10:00:20
当执行任务耗时小于fixedRate设置的时间时,将会按照表中的开始时间执行任务,即每隔5秒会执行一个任务:
@Component
public class TestScheduling {
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Scheduled(fixedRate=5000)
public void myTask() throws InterruptedException {
LOG.info("执行时间:{}",sdf.format(new Date()));
}
}
当执行任务耗时大于fixedRate设置的时间时,以下一张图就很清楚的表示了(图的出处)
解析一下:
fixedRate设置的也是为fixedRate=5000
第一个任务开始执行时间是0:00,耗时8秒
第二个任务本应该开始执行时间是0:05,但是第一个任务执行完时间已经是0:08,所以第二个任务在第一个任务执行完毕之后会立即执行,耗时是3s
第三个任务本应该开始执行时间是0:10,但是前两个任务执行完毕时间已经是0:11,所以第三个任务在第二个任务执行完毕之后会立即执行,耗时是3s
第四个任务,也同第二、第三个任务一样,在预计开始执行的时间(这里第四个任务预计开始执行时间是0:15),因为上一个任务还没有执行完毕,所以要等待上一个人执行完毕之后才会执行。
第五个任务预计开始执行时间是0:20,而前四个任务在0:19已经执行完毕,需要等待1秒,到达我们预计的开始执行时间(0:20)才会执行第五个任务。
2.fixedDelay
这个就比之前的fixedRate简单得多。如设置fixedRate=5000.下一个任务只需要盯着上一个任务的屁股(执行完毕的时间)就行了。上一个任务执行完毕5秒之后,下一个任务就会开始执行
@Component
public class TestScheduling {
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Scheduled(fixedDelay=5000)
public void myTask(){
LOG.info("开始执行时间:{}",sdf.format(new Date()));
try {
Thread.sleep(8000);//让任务执行的耗时时间为8秒,有利于我们的观察
} catch (InterruptedException e) {
e.printStackTrace();
}
LOG.info("执行完毕时间:{}",sdf.format(new Date()));
}
}
3.initialDelay
用于配合fixedRate和fixedDelay使用的,作用是在容器启动后经过多长时间才开始执行第一次任务。
4.扩展一下
我们先看下一下@Scheduled注解里面有什么
fixedDelayString、fixedRateString和initialDelayString不就是我们上面讲的三个加个字符串嘛,之前的三个都是long类型,这三个是String类型,顾名思义,不就是用字符串表示嘛。作用其实就是为了能在application.properties配置
@Component
public class TestScheduling {
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Scheduled(initialDelay = 5000,fixedDelayString = "${com.liang.scheduled:5000}")
public void myTask(){
LOG.info("开始执行时间:{}",sdf.format(new Date()));
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
e.printStackTrace();
}
LOG.info("执行完毕时间:{}",sdf.format(new Date()));
}
}
:5000作用是防止application.properties没有配置com.liang.scheduled属性则使用默认的5000(如果没有写:5000且application.properties没有配置com.liang.scheduled属性会报异常)
执行结果:和我们预计的一样,下一次开始执行时间与上一次结束时间间隔正好是10秒。如果去掉application.properties中的com.liang.scheduled属性,则间隔时间是默认的5秒,这个自行验证。
第二种cron表达式
网站:http://cron.qqe2.com/
这个自行去网
备注:https://blog.csdn.net/qq_33643072/article/details/81334268