Spring定时任务@Scheduled提前一秒执行

33 篇文章 1 订阅

Spring定时任务@Scheduled提前一秒执行

程序中设置了一个定时备份数据库的定时任务,每天0:00执行,用了快数年之久一直好好的,直到今天发现大量天表没有转移,导致大批量卡片流量计算出错,经过查询定时任务居然提前一秒执行了,导致后续代码中获取当前时间,获取的是提前一秒的时间,经过装换2021-11-26, 27号数据就这么变成26号数据。为什么会提前1秒来执行定时任务?

开启bug战斗之路新篇章!

程序中运行已久的代码

image-20211201145636914

突然来的小惊喜

image-20211201144921248

DateTime的精确性和准确性
“现在几点?”这个问题实际上只能以一个反映系统内在准确性水平的精确度来回答。大多数计算机时钟即使在毫秒的正式时间内也不能精确地同步。DateTime结构的确如此精确,但他们几乎肯定不是那么准确。

对于这种问题的探讨是存在,这种问题也是虽然发生概率极小,但发生了就是重大事故。但网络中并没有此问题确切的记载,本博文也不能保证原因,对于这种问题暂时没有深究

对于时间问题的讨论可参考博文 : 日期时间准确与精密

对于时间问题的讨论可参考博文 : 日期时间准确与精密

对于时间问题的讨论可参考博文 : 日期时间准确与精密

修复方法

方法一(推荐)

​ 不改变定时任务时间,依然是整点时间,可以在定时任务中重新获取当前时间,然后进行手动增加一分钟

​ 例如:new Date(new Date().getTime()+60000), 如果不够就十分钟(看你选择)

方案二

​ 改变定时任务时间,在定时任务中延后一分钟即可

网上有版本说增加线程解决,我想说这种方法对于越来越庞大的系统来说是无效的

/**
 * 设置主线程一次可以进100个线程
 *
 * @return
 */
@Bean
public TaskScheduler taskScheduler() {
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setPoolSize(200);
    return taskScheduler;
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值