问题:
我们的@scheduled 定时任务 有时候会突然出现执行时间不正确的现象
通过日志分析我
排出了
1.线程阻塞
2.CG 时间太久
同时我还发现 这些定时任务都延迟执行了,并且延迟的时间还是一样的都是2分钟
原本应该 2022-09-08 23:50:00 执行的 真实执行时间是 2022-09-08 23:52:00
原本应该 2022-09-08 23:40:00 执行的 真实执行时间是 2022-09-08 23:42:00
这就很奇怪了延迟执行还有规律了
于是我猜测这个应该与系统时间有关,后来询问运维同事,发现他们真的修改了系统时间,而且刚好调后了2分钟
问题这就基本定位了,现在就数验证了
我测试用例2个定时任务
一个任务:每天 10:00:00 执行一次
一个任务:没 5 分钟执行一次
@Scheduled(cron = "0 0/3 * * * ? ")
public void test1(){
logger.error(String.format("每3分钟运行一次"));
}
@Scheduled(cron = "0 55 16 * * ?")
public void test2(){
logger.error(String.format("每天16:55:00运行一次"));
}
日志打印
[2022-09-19 16:41:00.001] [] @scheduled-11] 每3分钟运行一次
[2022-09-19 16:47:50.812] [] [@scheduled-14] 每3分钟运行一次
[2022-09-19 16:48:00.002] [] [@scheduled-10] 每3分钟运行一次
[2022-09-19 16:51:00.002] [] [@scheduled-13] 每3分钟运行一次
[2022-09-19 16:54:00.002] [] [@scheduled-1] 每3分钟运行一次
[2022-09-19 16:57:00.005] [] [@scheduled-14] 每3分钟运行一次
[2022-09-19 16:57:49.721] [] [@scheduled-7] 每天16:55:00运行一次
通过测试发现 第二行日志和最后一行日志有问题
第二行日志应该时 [2022-09-19 16:44:00.001] 才正确,以为我修改了时间
但是以为我 修改了时间 但是 [2022-09-19 16:47:50.812] 打印的日志
第三行之后的日又是正确的了,通过这个现象可以分析
总结:定时任务每次执行后会重新计算下次执行的倒计时,再下次执行之前,定时任务的执行时间和系统时间无关