1.问题描述
在我们系统设计过程中,需要用到定时器,这时候我们用到了spring的Scheduled。系统逻辑为在每天的23:00:00( @Scheduled(cron = “0 0 23 * * ?”) )定时检测系统数据,并进行备份。用到的是cron表达式,自己测试定时器都是正常运行,可是一到测试那边定时器起作用,到了时间点一点变化都没有。
给大家安利一个在线网站,用于定时任务配置https://cron.qqe2.com,可以选择时间,系统自动生成表达式。
2.问题复现
经过一系列的排查发现,原来是测试过程中,测试先将服务启动。然后再手动调整服务器本地时间为22:59:00秒,等23点的时候,看定时任务是否执行。 因为,spring的定时器是在服务启动初始化的时候,便已经指定了下一次定时任务执行的时间,这时候手动去调整本地时间是没有效果的。
3.问题解决
我们在查看代码中可以看到,Scheduled 定时器中使用的是相对时间,即是不会随着本地时间变动而做出动态变化,在项目启动时候,便缓存了本地时间到系统服务中,后面再更改本地时间是没有效果的。
解决方案: 先把本地时间改为自己想要的时间,然后再重启服务。