Quartz调度器堵塞原理和解决

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

配置

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

放的速度时,资源就会被耗尽。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot可以很方便地与Quartz调度框架进行整合。整合的步骤如下: 1. 首先,项目需要基于Spring Boot 2.x版本进行开发。 2. 接下来,需要在项目的pom.xml文件中添加Quartz的依赖项。可以通过以下代码进行添加: ```xml <!--quartz依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> ``` 3. 然后,需要在项目的配置文件(如application.yml或application.properties)中进行相关配置。具体的配置内容可以参考文档或示例代码。 4. 创建一个任务测试类,用于定义具体的任务逻辑。在该类中,可以使用Quartz提供的注解来标识任务的执行时机和频率。 5. 最后,需要配置Quartz的相关配置。可以创建一个QuartzConfiguration类,在其中进行相关的配置,如定义任务调度、设置触发等。 通过以上步骤,就可以实现Spring Boot与Quartz调度框架的整合,从而实现任务调度功能。Quartz是Java开发中常用的任务调度框架,因为其功能强大且易于使用,被广泛应用于各种项目中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [SpringBoot整合Quartz调度框架实现任务调度(附学习源码)](https://blog.csdn.net/weixin_44421461/article/details/115107220)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [SpringBoot整合Quartz调度框架实现任务调度](https://blog.csdn.net/hlli86/article/details/115057837)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值