首页 > 编程知识 正文

贝壳,踩的坑多了

时间:2023-05-04 06:11:04 阅读:60162 作者:540

公司有定时任务,跑了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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。

  • 相关阅读