quartz中部分Job未执行的原因有3个
1 所有的线程都忙着其它的调度任务
2 调度器死掉了
3 Job的执行时间已近过去了
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秒
运行:
1JobA和JobB相继启动
2几秒钟后JobA数量达到10,其间JobB被执行若干次,则新的JobA和JobB均不能被启动,调度器进入阻塞状态
330秒后,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中的配置
但是,修改线程池的大小并不能解决调度器阻塞问题,因为资源消耗的速度不及资源释放的速度时,资源就会被耗尽。
分享到:
相关推荐
在这个类中,你需要重写`execute(JobExecutionContext context)`方法,这是Job执行的主要逻辑。例如: ```java public class MyJob implements Job { @Override public void execute(JobExecutionContext context...
5. **Calendar(日历)**:Quartz允许使用Calendar对象来排除某些日期或时间,使得Trigger在这些时间不触发Job执行。例如,你可能希望在周末或节假日不执行某个任务。 6. **CRON表达式**:CronTrigger使用CRON...
Quartz使用Job和Trigger的概念,Job是需要执行的任务,Trigger则是触发Job执行的时间规则。 在Java项目中,首先需要配置Quartz的Scheduler,然后创建Job类实现Job接口,定义任务执行的逻辑。接着,创建Trigger定义...
1. **Job(作业)**:Job是实际要执行的任务,它是实现了`org.quartz.Job`接口的类。开发者需要定义自己的Job类,覆盖`execute()`方法来实现具体的业务逻辑。 2. **Trigger(触发器)**:Trigger决定了Job何时被...
本篇文章将探讨如何结合Spring的ApplicationContext和Quartz,实现在程序中动态唤醒和管理Quartz的Job。 首先,`AppService.java`很可能包含了一个服务类,该类可能负责与Quartz相关的业务逻辑,例如创建、更新或...
JobDataMap是JobDetail的一部分,用于保存Job执行时需要的数据。JobDataMap可以存储一系列的对象,这些对象可以在Job执行时被获取。JobDataMap提供了便捷的存储和读取方法,可以存储基本类型数据、对象数据等。 在...
Java定时任务是应用程序中不可或缺的一部分,它允许程序在特定时间执行特定操作,无需用户干预。在JDK 1.3及以后的版本中,`java.util.Timer`类提供了基础的定时任务支持。不过,`Timer`类的功能相对有限,无法精确...
Quartz是中国最流行的开源计划任务库之一,它允许开发者在Java应用程序中安排任务的执行。这个"quartz-all-1.6.0.jar"包包含了Quartz库的完整功能,适用于1.6.0版本。Quartz的核心特性是能够创建、触发和管理定时...
在Quartz中,Job是执行的具体任务,而Trigger则是定义任务执行的时间规则。通过组合Job和Trigger,我们可以创建一次性任务或周期性任务。例如,你可以设置一个每天凌晨1点运行的清理数据库日志的任务。 `quartz-all...
在IT行业中,定时任务是许多系统不可或缺的一部分,用于在特定时间执行特定的业务逻辑。Spring框架,作为一个强大的Java企业级应用开发框架,提供了多种实现定时任务的方法。在本篇文章中,我们将聚焦于Spring 2.0中...
JobDataMap可以用来传递参数到Job执行上下文中。 Trigger的类型有多种,如SimpleTrigger和CronTrigger。SimpleTrigger适用于固定间隔的重复执行,而CronTrigger则允许我们基于Cron表达式设置复杂的执行计划。Cron...
线程池是 Quartz 的核心组成部分,用于管理和执行触发的任务。本文将深入探讨 Quartz 线程池的工作原理、配置以及如何在实际项目中应用。 ### 一、Quartz 线程池的基本概念 线程池是计算机科学中的一个概念,主要...
Quartz的源码阅读可以帮助理解其内部工作原理,如JobStore是如何存储和检索Jobs和Triggers的,以及Trigger是如何触发Job执行的。 通过学习Quartz Job Scheduling Framework,开发者可以有效地实现后台任务自动化,...
`<trigger>`元素则定义了触发Job执行的规则,这里使用的是Cron Trigger,可以根据Cron表达式设定执行频率。 `cron-expression`中的"0 0/5 * * * ?"表示每5分钟执行一次。Cron表达式有6个字段,依次代表秒、分、小时...
Quartz 是一个开源的作业调度框架,广泛应用于Java应用程序中,用于执行定时任务。它提供了丰富的API和灵活性,使得开发者可以方便地定义、安排和管理各种任务。版本1.8.6是Quartz的一个稳定版本,它包含了对数据库...
这个类可能是博客中示例代码的一部分,展示了如何在实际项目中使用Quartz。 总的来说,这篇博客会是学习和理解Quartz执行定时任务的好资源,涵盖了从基本概念到实践应用的多个层面。通过阅读和实践,开发者能够掌握...
6. **JobDataMap**:JobDataMap 是 JobDetail 中的一部分,用于存储 Job 执行时所需的数据。这些数据可以在 Job 执行期间通过 JobExecutionContext 访问。 7. **持久化**:Quartz 支持数据库持久化,可以将 Job 和 ...
Quartz Job Scheduling Framework是一个广泛使用的开源作业调度框架,它允许开发者在Java应用程序中精确地安排任务执行。本文档将深入探讨Quartz的核心概念、功能和实现方式,以帮助理解第2章的翻译初稿。 Quartz的...
本文将深入探讨如何利用Quartz进行任务管理和执行,以及其在实际项目中的应用。 一、Quartz简介 Quartz是由OpenSymphony开源组织开发的一款开源的作业调度框架,它提供了丰富的API,使得开发者能够方便地创建、管理...