JDK1.6在SUSE11下问题跳变定时任务失效问题记录

来源:互联网 发布:me452ch a是什么网络 编辑:程序博客网 时间:2024/06/08 00:40
问题现象:使用ScheduleExecutorService部署定时任务,在时间向过去跳变比如当前11点跳变为10点后,定时任务突然失效,然后再次到11点时所有积压的定时任务(10-11点)一起执行,可能导致业务压力过大
问题原因:POSIX提供的标准计时器API进行封装,主要提供了两种类型的时钟的封装:CLOCK_REALTIME和CLOCK_MONOTONIC,第一种绝对时间,第二种是相对时间,JDK1.6中使用的是第一种,jdk内部的修复方式是改为第二种(见bug链接最下面评论)
为什么会存在定时任务积压呢?内部实现原理应该和Timer类实现比较类似,即内部有一个队列,以11点跳变到10点为例,假设有个10分钟执行一次的定时任务,本来马上要执行11:10分的定时任务,但是跳变了,然后10:10分的任务进入队列,然后每次队首时间和当前时间比较,如果<=当前时间,则出队列,所以再次到11点10分的时候,之前的任务都出队列然后依次执行了.

问题解决:升级业务JDK1.6为JDK1.8

此外,比较神奇的是在SUSE10的业务主机上并没有这个问题;

0 0