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

问题现象:使用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的业务主机上并没有这个问题;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值