Spring定时任务,修改系统时间的问题
做项目时,需要一个定时任务,定期的将日志处理成报表,并生成报表。可是,这个项目到测试那里,测试,出了bug,定时任务不能触发。。。。。。我自己测试,发现,只要修改了系统的时间:例:我定了每周一0晨0点执行。。我改成前周的周日的22点,结果,并没有触发定时任务,项目的日志里也没有定时任务的触发时产生的日志信息。。。。
我想问,为啥修改了系统时间定时任务就不触发了??修改系统时间后,如果重启这个项目的服务,就可以正常的触发定时任务。。。。是为什么呢??????
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
你的bug和修改系统时间无关吧?这个问题就是想知道为什么项目运行中修改系统时间需要重启才能生效?
HP-UNIX jvm有个问题是,jvm启动之后会记录系统时间,然后jvm根据CPU ticks自己来算时间,而不是去拿系统时间
详见通过HP-UNIX jvm获取的时间与操作系统不一致问题分析
你这个问题是调用ScheduledThreadPoolExecutor造成的么,在周期调度任务过程中,如果将系统时间突然拨前,就会发现在队列中的线程不再被调度了,调度器似乎停止了,具体原因找了半天也没有找到,有高手帮忙解答一下么。出现问题的环境是centos5+jdk1.7,PS:在win7+jdk1.6下未重现。。。。。
Timer类的调度是基于绝对的时间的,而不是相对的时间,因此Timer类对系统时钟的变化是敏感的,举个例子,加入你希望任务1每个10秒执行一次,某个时刻,你将系统时间提前了6秒,那么任务1就会在4秒后执行,而不是10秒后。在 ScheduledThreadPoolExecutor,任务的调度是基于相对时间的,原因是它在任务的内部 存储了该任务距离下次调度还需要的时间(使用的是基于 System#nanoTime实现的相对时间 ,不会因为系统时间改变而改变,如距离下次执行还有10秒,不会因为将系统时间调前6秒而变成4秒后执行)。