公司有定时任务,跑了10天就挂了,看了日志也没有任何错误信息,发现了问题点并做了记录。
scheduleAtFixedRate () ()和scheduleWithFixedDelay () )的区别在于scheduleWithFixedDelay ) )是延迟任务,而scheduleAtFixedRate () )
scheduledexecutorserviceservices=executors.newscheduledthreadpool (2);
//scheduleWithFixedDelay
services.schedulewithfixeddelay (newmyrunnable ),10,2 * 60,TimeUnit.SECONDS );
//scheduleAtFixedRate
services.scheduleatfixedrate (newmyrunnable ),10,2 * 60,TimeUnit.SECONDS );
在我的理解中,scheduleWithFixedDelay ()定时任务在10秒后开始第一次运行,比上次任务运行晚120秒执行第二个任务。 scheduleAtFixedRate ()计时器任务将在10秒钟后运行,在120秒钟后,无论上一个任务是否完成,第二个任务都将直接开始运行。 (错误理解)
scheduleAtFixedRate和scheduleWithFixedDelay的区别是在看了大人物的博客后才知道的。 我的理解有点问题:
scheduleAtFixedRate对上一个任务开始的时间进行计时,检测经过120秒后是否执行了上一个任务,如果执行了上一个任务,则立即执行当前任务,如果没有执行上一个任务,则执行上一个任务
scheduleWithFixedDelay在前一个任务完成时开始计时,并在120秒后立即运行。
除了另一个大人物的博客之外,我还发现了问题。 Java时间线程池停止超时任务。 据博客报道:
对于时间线程池,很多人考虑设定频率(例如1Min ),根据其间隔按每个部门进行工作。 但是,如果任何一个调度任务堵塞,不仅这次调度失败,而且整个线程池也将停留在这次调度上。
回顾代码,整个定时任务中完全没有try.catch .异常,但上次连接到数据库时发生某些异常,导致所有后续计划任务都无效(上一个任务未完成),最后整个定时任务。
知道了原因,解决了就好办了。 在线程的run ()方法中用try.catch.fianlly .括起来
@Override
公共void run (}
try {
//初始化数据库
Jedi sb ns3 redis=myjedispool.get redis (;
if(null==bns3redis ) {
Logger.error(initJedisfailed );
}
//do sth
Sarthandle(bns3redis;
}catch(exceptione ) {
e .打印堆栈跟踪(;
logger.error(exception: ) e.getmessage );
} finally {
if (空!=bns3Redis )
try {
bns3Redis.close (;
}catch(exceptione ) {
logger.error (' closeredisexception : ' e.getmessage ) );
bns3Redis=null;
}
}
logger.info ('=====update time=========' update time )
————————————————
这是CSDN博客“Canon in D”的原始文章,符合CC 4.0 BY-SA版权协议。 请附上原文来源的链接和本声明。
原文链接: https://blog.csdn.net/weixin _ 42683408/article/details/82255304