Quartz 调度器以多线程的方式执行调度任务JobDetail,缺省线程池大小为10,也就是说若调度器中已有10个Job在工作(线程没有结束),那么即使有JobDetail到了被触发的时间,新的JobDetail不会被执行,也就是说阻塞的条件是,调度器中正在运行的JobDetail数量达到了设定值10。 举一个具体的例子: a. 单一Job 配置: JobA 触发时间为 每秒运行一次,每个Job执行时间为30秒 运行: 1、 10个JobA将连续启动 2、 到第10个JobA启动后,线程池中所有线程被耗尽,调度器出现了阻塞,即没有新的JobA启动,尽管设置为每秒执行一次。 3、30秒后,将有1个以上JobA执行完毕,在短时间内,新的10个JobA又被启动,再次进入2的阻塞状态 2状态可以称做调度器阻塞状态,没有新的Job能执行,导致一些诸如定时读取数据的操作无法继续下去。除非有JobA执行完毕,新的JobA才能被执行。实际运行中,假设调度器中有一个JobA线程的执行时间大于两次启动间隔,则经过若干次操作后,将耗尽所有10个线程资源,导致其他的调度任务阻塞。 b. 多个Job(无状态Job) 在这个测试中,可以有多种不同的Job(无状态Job),但它们均共享这10个线程,任何一个Job 线程执行时间大于两次启动间隔均有可能导致调度器被阻塞。例如: 配置: JobA 触发时间为 每秒运行一次,每个Job执行时间为30秒;JobB 触发时间为每秒运行一次,每次执行时间小于1秒 运行: 1。JobA和JobB相继启动 2。几秒钟后JobA数量达到10,其间JobB被执行若干次,则新的JobA和JobB均不能被启动,调度器进入阻塞状态 3。30秒后,JobA(0-9)相继执行完毕,新的JobA和JobB均有机会被重新启动,短时间内,再次进入2的阻塞状态 如何解决调度器阻塞问题? 1、 延长可能需要较长时间执行的JOB的时间间隔,假设Job执行时间最大时间为t1, 两次任务执行间隔调度时间为d1, 则d1>t1 2、 使用有状态调度任务StatefulJob代替没有状态的Job. 对于要求执行间隔时间尽可能短,又不希望造成阻塞的比较适合。可以同时有无状态的调度任务JobA,和有状态的调度任务JobB,JobB堵塞后不会对JobA造成影响,即读报文的任务阻塞了,不会对调度器中其他任务造成影响,同时JobA执行完后,可再次继续下一个任务。 如果JobA执行时间较长的话,可能造成JobA始终占用一个线程资源。 3、注意:一个调度器中如果有很多个Job(JobA,JobB,JobC...),其中有一个很容易堵塞,则该Job也会造成其他的Job阻塞 线程池大小配置在org.quartz下的quartz.properties文件中 org.quartz.threadPool.threadCount = 10 如若要修改线程池的大小,可以修改该文件中的 org.quartz.threadPool.threadCount值。亦可建一org.quartz包,包下放置quartz.properties文件,覆盖掉quartz.jar中的配置 但是,修改线程池的大小并不能解决调度器阻塞问题,因为资源消耗的速度不及资源释放的速度时,资源就会被耗尽。
分享到:
相关推荐
quartz集群调度机制调研及源码分析,基于quartz 1.7版本
深入解读Quartz的原理,定时任务框架是web开发过程中使用很多的框架之一
Spring中Quartz调度器的使用Spring中Quartz调度器的使用
Spring中Quartz调度器的使用 示例代码
环境:myEclipse,tomcat,jdk Spring 2 使用OpenSymphony Quartz 调度器
quartz调度系统工具.zip
quartz定时调度完整实例 完美调度quartz定时调度完整实例 完美调度
quartz 调度引擎,quartz 调度引擎,quartz 调度引擎,quartz 调度引擎
Quartz任务调度器与spring整合,做项目的时候常听测试说谁在起着quartz,也不知道是啥,问了下同事,就是定时去执行某些任务的,刚好bug比较少,学习了一下~
QuartZ和Spring进行整合,让你更了解QuartZ作业调度器的用法
quartz自动调度的3种调度形式+传参 1.单纯的quartz调度 2.spring+quartz调度
NULL 博文链接:https://ch-dj.iteye.com/blog/1700788
Quartz任务调度框架教程中文版 chm格式
使用Quartz调度任务,根据需要人为的终止某个任务,适用于很多常见的场景
quartz 定时任务调度
Quartz调度任务学习(快速开发入门),帮助你快速掌握Quartz的开发,使用性较强
基于springboot的任务调度技术quartz简单的实现demo,根目录有数据表,需要配置到您自己的数据库中,之后点击运行即可,比较有趣的是其中会用到一些反射知识,还有难点就是要在调度任务执行的类上@service添加类的...
1.spring框架使用任务调度quartz的例子。 2.Web App用Quartz实现java schedule 3.详细讲解Quartz如何从入门到精通 4.用 Quartz 进行作业调度
前言:8月份翻译了Quartz.NET的官方课程:开源的作业调度框架 - Quartz.NET, 有的朋友抱怨难用,确实,目前Qiartz.NET的最新版本还是0.6,还存在很多bug和不完善的地方。本文使用一系列代码示例介绍 Quartz.NET API...