Spring调度定时任务的方式

 我来答
科创17
2022-06-16 · TA获得超过5902个赞
知道小有建树答主
回答量:2846
采纳率:100%
帮助的人:175万
展开全部
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”。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式