简介
在上篇中总结了quartz的基础,其实spring中也提供了这些基础功能,而且十分方便。简单来说在springboot中只需要两个注解:@Scheduled和@EnableScheduling。
fixedDelay:表示隔多少毫秒执行一次。
/**
* 每隔1秒执行一次
*/
@Scheduled(fixedDelay = 1000)
public void scheduleTest3() {
System.out.println("ccc" + new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
}
fixedDelayString: 和fixedDelay没什么区别,就相当于是String类型的而已。
/**
* 每隔5秒执行一次
*/
@Scheduled(fixedDelayString = "5000")
public void scheduleTest4() {
System.out.println("ddd" + new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
}
fixedRate: 这个简单来说也是每隔多少毫秒执行一次,但是如果这个任务执行了超过这个等待时间,则执行完上个任务之后会直接开始下一次任务。
/**
* 相当于每隔7秒执行一次
*/
@Scheduled(fixedRate = 1000)
public void scheduleTest5() {
System.out.println("eee" + new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
如上代码:使用fixedRate使得每隔1秒钟执行一次scheduleTest5()方法。但是scheduleTest5()方法需要7秒钟才能执行完,fixedRate会在scheduleTest5()第一次执行完之后直接执行第二次,而不会再去等待1秒,因为他在第一次scheduleTest5()开始任务的时候就已经等待过1秒了。
结果如图所示:
fixedRate与fixedDelay区别: 我们在返回来看看在fixedDelay执行的任务中睡眠7秒钟会怎么样???
/**
* 相当于每隔8秒执行一次
*/
@Scheduled(fixedDelay = 1000)
public void scheduleTest3() {
System.out.println("ccc" + new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
try {
Thread.sleep(7000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
结果如图所示,fixedDelay是会等待着1秒的,相当于会等待8秒钟执行下一次任务。
总结: 个人觉得,可以这么理解:fixedDelay是上一次执行任务结束时间和下一次执行任务开始时间之间的时间差;fixedRate上一次执行任务开始时间和下一次执行任务开始时间之间的时间差,如果执行任务时间超过了fixedRate设置的时间,则不会再进行等待,将会直接执行下一次任务。如果执行任务时间超过了两个的设置时间,都会等执行任务先执行完的,并不会另起一个线程开始下一个任务,这也许是他们的共同点吧。
cron: spring中的schedule当然也支持cron表达式,但是需要注意的是,spring中的cron和cron官网的在周上面是区别。
数字 | cron | spring |
---|---|---|
1 | 周日 | 周一 |
2 | 周一 | 周二 |
3 | 周二 | 周三 |
4 | 周三 | 周四 |
5 | 周四 | 周五 |
6 | 周五 | 周六 |
7 | 周六 | 周七 |
代码证明:
@Scheduled(cron = "0 32 14 ? * 5")
public void scheduleTest() {
System.out.println("aaa" + new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
}
@Scheduled(cron = "0 32 14 ? * 4")
public void scheduleTest2() {
System.out.println("bbb" + new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
}
结果如图所示:
zone:表示时区,个人觉得这个东西没什么用,因为大部分都是在国内。。。
initialDelay: 表示在第一次执行之前延迟多少毫秒在执行。
/**
* 第一次延迟10秒之后再执行,然后每个5秒执行一次
*/
@Scheduled(initialDelay = 10000, fixedDelay = 5000)
public void scheduleTest8() {
System.out.println("ggg" + new SimpleDateFormat("YYYY-MM-dd HH:mm:ss").format(new Date()));
}
结果如图所示: