Quartz调度器堵塞原理和解决

转载 2013年12月02日 17:54:32

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中的配置

但是,修改线程池的大小并不能解决调度器阻塞问题,因为资源消耗的速度不及资源释放的速度时,资源就会被耗尽。



转载自:http://blog.csdn.net/hongweigg/article/details/6188238

Spring使用之:Quartz定时任务为什么会被阻塞

周日,公司CTO给我打电话说,监控系统的数据从下午1点就不更新了。我登录服务器排除了数据同步问题,查看日志也没有例外抛出,查询了前一天的 日志发现几个数据库表空间溢出例外。最后定位,Spring定时任...

Quartz调度时好时坏解决方案

    最近同事向我报怨说:选用的作业调度框架Quartz不稳定,具体规律表现为分奇偶次调度,比如第一次可以调度,第二次就不能调度了,依次类推。    我建议说:最不济办法采用先删除后添加调度信息方式...
  • mzyp
  • mzyp
  • 2009年06月17日 16:57
  • 2568

java线程阻塞问题排查方法

我开发的worker,每隔几个月线上都会阻塞一次,一直都没查出问题。今天终于了了这个心结。把解决过程总结下和大家分享。     首先用jstack命令打出这个进程的全部线程堆栈。拿到线程dump文件之...

Spring使用之:Quartz定时任务为什么会被阻塞

Quartz定时任务为什么会被阻塞

Quartz入门实例5-处理因执行job超时而错过触发的job

例子将执行以下操作: 1/启动Quartz调度器 

在Quartz里面设置TimeOut的设计

试用了一下Quartz,功能很强大,可惜以前已经有这方面的设计了,要替换的话,工作量太大了。对于以前经常碰到的一个问题:超时(TimeOut)的处理机制,好像Quartz里面没有相关的处理对策,于是试...
  • gabbler
  • gabbler
  • 2010年01月05日 11:59
  • 3301

Spring使用之:Quartz定时任务为什么会被阻塞

周日,公司CTO给我打电话说,监控系统的数据从下午1点就不更新了。我登录服务器排除了数据同步问题,查看日志也没有例外抛出,查询了前一天的 日志发现几个数据库表空间溢出例外。最后定位,Spring定时任...

Quartz的任务的临时启动和暂停和恢复

Quartz的任务的临时启动和暂停和恢复   在项目中需要手动启停某些服务,那么需要有一个控制这些任务的类。由于任务是有Quartz控制的,我们只需要通过Quartz的相关的API实现相关的功能即可。...
  • xpsharp
  • xpsharp
  • 2014年02月16日 16:47
  • 5597

Quartz学习之实现关闭超时2天未付款的订单

1、依赖: org.quartz-scheduler quartz 2.2.1 org.springframework spring-context-su...

quartz执行卡死--强制中断线程

在quartz中经常会碰到由于网络问题或者一些其他不稳定因素导致的线程卡死问题,这往往会导致数据处理的延时。而有时候一时无法定位到卡死的原因,为了降低系统风险,我们就会希望有一个超时机制,当执行超时时...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Quartz调度器堵塞原理和解决
举报原因:
原因补充:

(最多只允许输入30个字)