Spring定时任务@Scheduled提前一秒执行
程序中设置了一个定时备份数据库的定时任务,每天0:00执行,用了快数年之久一直好好的,直到今天发现大量天表没有转移,导致大批量卡片流量计算出错,经过查询定时任务居然提前一秒执行了,导致后续代码中获取当前时间,获取的是提前一秒的时间,经过装换
2021-11-26
,27
号数据就这么变成26号数据。为什么会提前1秒来执行定时任务?开启bug战斗之路新篇章!
程序中运行已久的代码
突然来的小惊喜
DateTime的精确性和准确性
“现在几点?”这个问题实际上只能以一个反映系统内在准确性水平的精确度来回答。大多数计算机时钟即使在毫秒的正式时间内也不能精确地同步。DateTime结构的确如此精确,但他们几乎肯定不是那么准确。
对于这种问题的探讨是存在,这种问题也是虽然发生概率极小,但发生了就是重大事故。但网络中并没有此问题确切的记载,本博文也不能保证原因,对于这种问题暂时没有深究
对于时间问题的讨论可参考博文 : 日期时间准确与精密
对于时间问题的讨论可参考博文 : 日期时间准确与精密
对于时间问题的讨论可参考博文 : 日期时间准确与精密
修复方法
方法一(推荐)
不改变定时任务时间,依然是整点时间,可以在定时任务中重新获取当前时间,然后进行手动增加一分钟
例如:new Date(new Date().getTime()+60000)
, 如果不够就十分钟(看你选择)
方案二
改变定时任务时间,在定时任务中延后一分钟即可
网上有版本说增加线程解决,我想说这种方法对于越来越庞大的系统来说是无效的
/**
* 设置主线程一次可以进100个线程
*
* @return
*/
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(200);
return taskScheduler;
}