Spring 定时任务
记录下 cron 表达式的用法,和正则一样,没法记,只能用到时查下。
介绍
本文主要记录下 cron 表达式的用法,方便下次使用。
配置
程序主入口添加 @SpringBootApplication
和 @EnableScheduling
注解以启动定时任务。
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class SchedulingTasksApplication {
public static void main(String[] args) {
SpringApplication.run(SchedulingTasksApplication.class);
}
}
然后方法上添加 @Scheduled
注解就行了。当然类注解 @Component
也必不可少。
@Scheduled(fixedDelay = 5000)
public void reportCurrentTime() {
System.out.println(new Date());
}
定时调度
fixedDelay
毫秒单位,以上一个调用的完成时间开始计算。
如间隔 3 秒,每个任务耗时 2 秒:
@Scheduled(fixedDelay = 3000)
public void errorSpiderRerun(){
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("start " + localDateTime);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end " + LocalDateTime.now());
}
结果如下:
start 2020-06-02T15:49:59.650
end 2020-06-02T15:50:01.651
start 2020-06-02T15:50:04.653
end 2020-06-02T15:50:06.653
start 2020-06-02T15:50:09.654
end 2020-06-02T15:50:11.655
start 2020-06-02T15:50:14.657
fixedRate
需要固定速率,则使用 fixedRate
。
如间隔 3 秒,每个任务耗时 2 秒:
@Scheduled(fixedRate = 3000)
public void errorSpiderRerun(){
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("start " + localDateTime);
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end " + LocalDateTime.now());
}
结果如下:
start 2020-06-02T15:58:03.563
end 2020-06-02T15:58:05.563
start 2020-06-02T15:58:06.563
end 2020-06-02T15:58:08.563
start 2020-06-02T15:58:09.563
end 2020-06-02T15:58:11.563
start 2020-06-02T15:58:12.563
end 2020-06-02T15:58:14.563
但是若上个任务耗时超过间隔,则下一次也需要在等待,等到结束后下一次立刻执行。
如等待 7 秒后结果如下:
start 2020-06-02T16:02:37.726
end 2020-06-02T16:02:44.727
start 2020-06-02T16:02:44.727
end 2020-06-02T16:02:51.727
start 2020-06-02T16:02:51.727
end 2020-06-02T16:02:58.727
start 2020-06-02T16:02:58.727
end 2020-06-02T16:03:05.728
start 2020-06-02T16:03:05.728
initialDelay
默认项目启动立即执行定时任务,若想要延迟,使用 initialDelay
参数。
@Scheduled(initialDelay = 10000, fixedRate = 3000)
结果如下:
2020-06-02 16:09:00.487 [main] INFO LabelApplication - Started LabelApplication in 4.901 seconds (JVM running for 5.689)
start 2020-06-02T16:09:10.467
end 2020-06-02T16:09:15.468
cron 表达式
用法太多了,每次项目用到就记一下吧。
表达式 | 描述 |
---|---|
1 2 3 * * ? * | 每天 3 点 2 分 1 秒执行 |
1 2 3 L * ? * | 每月最后一天 3 点 2 分 1 秒执行 |
1 2 3 4 * ? * | 每月 4 号 3 点 2 分 1 秒执行 |
0 0 12 ? * WED | 每周三执行 |
Last modified on 2020-06-02