Spring调度定时任务的方式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring调度定时任务的方式相关的知识,希望对你有一定的参考价值。

参考技术A spring 定时器任务scheduled-tasks默认配置是单线程串行执行的,多个任务相当于串行。每个job都是等待上个执行完了才执行下一个job。这就造成了若某个任务执行时间过长,其他任务一直在排队,业务逻辑没有及时处理的问题。

spring调度定时任务的方式就会导致:bTask会因为aTask的超时执行而延迟执行。

如下是scheduled定义了3个任务。

查看该任务17点的执行日志(task名字已修改)

MyTask2每10秒钟执行一次,但是在17:15:05 到17:20:35之间,5分钟内定时任务没有执行。

执行命令 zgrep -e '2016-10-28 17:1' task.log.2016-10-28.log.gz (当天17点10几分发生的日志)。然后在查询日志发现,这5分钟之内有大量的日志在执行。

通过过以上日志可以看出,该线程 [pool-8-thread-1 - ] 一直在处理MyTask3任务,此时断定 task:scheduled 配置默认是单线程串行的。网上查找资料发现如下配置可以解决问题:

Spring中可以通过配置方便的实现周期性定时任务管理,这需要用到以下几个类:

concurrent:对于相同的JobDetail,当指定多个Trigger时, 很可能第一个job完成之前,第二个job就开始了。定concurrent设为false,多个job不会并发运行,第二个job将不会在第一个job完成之前开始。

MethodInvokingJobDetailFactoryBean类默认是并发执行的,这时候如果不设置“concurrent”为false,很可能带来并发或者死锁的问题,而且几率较小,不容易复现,请大家使用的时候注意设置“concurrent”。

以上是关于Spring调度定时任务的方式的主要内容,如果未能解决你的问题,请参考以下文章

Spring使用@Scheduled进行定时任务,定的时间可否变

spring定时任务

任务调度(02)Spring Schedule

探究 Spring 的定时任务配置

spring cloud互联网分布式微服务云平台规划分析--spring cloud定时调度平台

spring cloud互联网分布式微服务云平台规划分析--spring cloud定时调度平台