原文地址:http://www.hxstrive.com/article/385.htm
核心概念
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便。Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。
1、Job
Job表示一个工作,要执行的具体内容。此接口中只有一个方法
1
void execute(JobExecutionContext context)
2、JobDetail
JobDetail 表示一个具体的可执行的调度程序,Job 是这个可执行程调度程序所要执行的内容,另外 JobDetail 还包含了这个任务调度的方案和策略。
3、Trigger
Trigger代表一个调度参数的配置,什么时候去调。
4、Scheduler
Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。
一个最简单入门实例
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.util.Date;
/**
* quartz 定时器测试
* @author leizhimin 2009-7-23 8:49:01
*/
public class MyJob implements Job {
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(new Date() + ": doing something...");
}
}
class Test {
public static void main(String[] args) {
// 1、创建 JobDetial 对象
JobDetail jobDetail = new JobDetail();
// 设置工作项
jobDetail.setJobClass(MyJob.class);
jobDetail.setName("MyJob_1");
jobDetail.setGroup("JobGroup_1");
// 2、创建 Trigger 对象
SimpleTrigger strigger = new SimpleTrigger();
strigger.setName("Trigger_1");
strigger.setGroup("Trigger_Group_1");
strigger.setStartTime(new Date());
// 设置重复停止时间,并销毁该 Trigger 对象
java.util.Calendar c = java.util.Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis() + 1000 * 1L);
strigger.setEndTime(c.getTime());
strigger.setFireInstanceId("Trigger_1_id_001");
// 设置重复间隔时间
strigger.setRepeatInterval(1000 * 1L);
// 设置重复执行次数
strigger.setRepeatCount(3);
// 3、创建 Scheduler 对象,并配置 JobDetail 和 Trigger 对象
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = null;
try {
scheduler = sf.getScheduler();
scheduler.scheduleJob(jobDetail, strigger);
// 4、并执行启动、关闭等操作
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
// try {
// //关闭调度器
// scheduler.shutdown(true);
// } catch (SchedulerException e) {
// e.printStackTrace();
// }
}
}
当把结束时间改为:
// 设置重复停止时间,并销毁该 Trigger 对象
java.util.Calendar c = java.util.Calendar.getInstance();
c.setTimeInMillis(System.currentTimeMillis() + 1000 * 1L);
strigger.setEndTime(c.getTime());
当添加一条关闭调度器的语句:
// 4、并执行启动、关闭等操作
scheduler.start();
scheduler.shutdown(true);
程序执行结果:
Thu Jul 23 10:11:50 CST 2009: doing something...
Process finished with exit code 0
仅仅执行了一次,这一次能执行完,原因是设定了 scheduler.shutdown(true);true 表示等待本次任务执行完成后停止。从这里也可以看出,scheduler 是个容器,scheduler 控制 jobDetail 的执行,控制的策略是通过 trigger。当 scheduler 容器启动后,jobDetail 才能根据关联的 trigger 策略去执行。当 scheduler 容器关闭后,所有的 jobDetail 都停止执行。
透过实例看原理
通过研读 Quartz 的源代码,和本实例,终于悟出了 Quartz 的工作原理。
1、scheduler 是一个计划调度器容器(总部) ,容器里面可以盛放众多的 JobDetail 和 trigger,当容器启动后,里面的每个 JobDetail 都会根据 trigger 按部就班自动去执行。
2、 JobDetail 是一个可执行的工作,它本身可能是有状态的。
3、 Trigger 代表一个调度参数的配置,什么时候去调。
4、 当 JobDetail 和 Trigger 在 scheduler 容器上注册后,形成了装配好的作业(JobDetail 和Trigger 所组成的一对儿) ,就可以伴随容器启动而调度执行了。
5、 scheduler 是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。
总结
1、搞清楚了上 Quartz 容器执行作业的的原理和过程,以及作业形成的方式,作业注册到容器的方法。就认识明白了 Quartz 的核心原理。
2、Quartz 虽然很庞大,但是一切都围绕这个核心转,为了配置强大时间调度策略,可以研究专门的 CronTrigger。要想灵活配置作业和容器属性,可以通过 Quartz 的 properties 文件或
者 XML 来实现。
3、要想调度更多的持久化、结构化作业,可以通过数据库读取作业,然后放到容器中执行。
4、所有的一切都围绕这个核心原理转,搞明白这个了,再去研究更高级用法就容易多了。
5 、 Quartz 与 Spring 的 整 合 也 非 常 简 单 , Spring 提 供 一 组 Bean 来 支 持 :MethodInvokingJobDetailFactoryBean、SimpleTriggerBean、SchedulerFactoryBean,看看里面需要注入什么属性即可明白了。Spring 会在 Spring 容器启动时候,启动 Quartz 容器。
6、 Quartz 容器的关闭方式也很简单,如果是 Spring 整合,则有两种方法,一种是关闭 Spring容器,一种是获取到 SchedulerFactoryBean 实例,然后调用一个 shutdown 就搞定了。如果是Quartz 独立使用,则直接调用 scheduler.shutdown(true);
7、Quartz 的 JobDetail、Trigger 都可以在运行时重新设置,并且在下次调用时候起作用。这就为动态作业的实现提供了依据。你可以将调度时间策略存放到数据库,然后通过数据库数据来设定 Trigger,这样就能产生动态的调度。
相关推荐
quartz工作原理
### 深入解读Quartz的原理 #### 一、Quartz概述 Quartz 是一个功能强大且易于使用的 Java 开源定时任务调度器。它能够触发在指定的时间执行任务(通常称为作业)。Quartz 能够满足从简单的到非常复杂的业务场景...
### Quartz任务调度管理 #### 一、任务调度基础概念 ...以上介绍了Quartz任务调度的基础概念、工作原理以及如何使用Quartz框架进行任务调度。通过Quartz框架的强大功能,可以轻松实现复杂的任务调度需求。
在1.8.4这个版本中,用户可以获取到官方的原始代码、编译后的jar包以及官方提供的示例,这为开发者提供了深入理解Quartz工作原理和实践应用的宝贵资源。 Quartz的核心特性包括: 1. **灵活的任务调度**:Quartz...
2. **Quartz 工作原理**:Quartz 是基于 JDBC 或内存的数据存储方式来管理作业和触发器的。它通过 Scheduler 接口来调度作业,作业是需要执行的任务,触发器则定义了作业的执行时间或频率。Quartz 还支持 Cron ...
这个压缩包 "quartz-3.0.3.1_quartes_源码.zip" 包含了 Quartz 框架的源代码,版本为 3.0.3.1,对于学习和理解 Quartz 的工作原理以及进行定制化开发非常有帮助。 Quartz 主要功能包括: 1. **作业调度**:Quartz ...
源码阅读可以加深我们对Quartz工作原理的理解,从而更好地利用它来解决实际问题。 总的来说,Quartz结合cron表达式,提供了一种灵活且强大的方式来实现Java应用的定时任务。通过学习和实践,我们可以创建出符合业务...
总的来说,这个 Quartz 任务调度的运行示例为你提供了一个动手实践的机会,加深对 Quartz 工作原理的理解。通过学习和应用这个示例,你将能够自如地在 Java 应用程序中实现复杂的定时任务调度。
源代码部分是理解Quartz工作原理的关键。通过阅读源码,开发者可以深入理解其内部调度机制,包括如何创建Job、Trigger,以及如何将它们关联到Scheduler。此外,源码还展示了如何自定义Job和Trigger,以及如何扩展...
源码分析是理解Quartz工作原理的关键,通过阅读源码,我们可以深入理解Job、Trigger和Scheduler之间的协作机制,以及Quartz如何调度和执行任务。例如,Quartz使用了PriorityBlockingQueue来存储待执行的任务,保证了...
Quartz原理及实例,spring4.x+Quartz.2.2.1结合的开发,静态和动态实例
这个"Quartz使用实例"可能包含一个演示了如何配置和使用Quartz的项目,解压后可以直接运行,这对于初学者或者需要快速理解Quartz工作原理的人来说非常有用。 Quartz的核心概念包括Job(作业)、Trigger(触发器)和...
运行项目后,你可以看到任务按预期的时间和频率执行,从而加深对Quartz工作原理的理解。 总的来说,Quartz任务调度器实例提供了一个实践平台,帮助开发者学习和掌握如何在Java应用中实现定时任务,提升系统自动化...
源码中的核心类如`org.quartz.Scheduler`、`org.quartz.Job`和`org.quartz.Trigger`是理解Quartz工作原理的关键。通过阅读源码,我们可以了解如何创建、调度和管理Job以及Trigger。 【工具】: 作为一款工具,...
本文将深入探讨 Quartz 线程池的工作原理、配置以及如何在实际项目中应用。 ### 一、Quartz 线程池的基本概念 线程池是计算机科学中的一个概念,主要用于管理多个并发运行的线程。在 Quartz 中,线程池负责处理由 ...
Quartz是一个广泛应用于Java开发中的开源定时调度框架,它的强大功能和灵活性使得开发者能够轻松地创建和管理定时任务。在本文中,我们将深入探讨Quartz的核心概念以及如何通过一个简单的例子来实现一个基础的定时器...
学习和理解这个源码包,可以帮助你深入理解Quartz的工作原理,以及如何在实际项目中灵活运用。通过分析和实践,你可以掌握如何创建动态任务,如何根据业务需求调整任务执行策略,以及如何进行错误处理和监控。这将对...
Quartz的工作原理是通过定义Job(任务)和Trigger(触发器)来安排任务。Job是实际执行的任务,而Trigger则定义了何时启动这个任务。你可以创建自定义的Job类来实现特定业务逻辑,并通过Trigger设置触发时间,如每天...
7. **src**:源代码目录,包含Quartz.NET的源码,开发者可以查看和学习其内部工作原理。 8. **lib**:库文件夹,可能包含Quartz.NET依赖的外部库。 9. **doc**:文档目录,可能有API参考、用户指南等帮助材料。 *...