深刻解读Quartz的原理
Quartz是一个大名鼎鼎的Java版开源定时调度器,功能强悍,使用方便。
1、核心概念
Quartz的原理不是很复杂,只要搞明白几个概念,而后知道如何去启动和关闭一个调度程序便可。
一、Job
表示一个工做,要执行的具体内容。此接口中只有一个方法
void execute(JobExecutionContext context)
二、JobDetail
JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
三、Trigger表明一个调度参数的配置,何时去调。
四、Scheduler表明一个调度容器,一个调度容器中能够注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就能够被Scheduler容器调度了。
2、一个最简单入门实例
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) {
//一、建立JobDetial对象
JobDetail jobDetail =
new JobDetail();
//设置工做项
jobDetail.setJobClass(MyJob.
class);
jobDetail.setName(
"MyJob_1");
jobDetail.setGroup(
"JobGroup_1");
//二、建立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);
//三、建立Scheduler对象,并配置JobDetail和Trigger对象
SchedulerFactory sf =
new StdSchedulerFactory();
Scheduler scheduler =
null;
try {
scheduler = sf.getScheduler();
scheduler.scheduleJob(jobDetail, strigger);
//四、并执行启动、关闭等操做
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());
执行结果:
当添加一条关闭调度器的语句:
//四、并执行启动、关闭等操做
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都中止执行。
3、透过实例看原理
经过研读Quartz的源代码,和本实例,终于悟出了Quartz的工做原理。
一、scheduler是一个计划调度器容器(总部),容器里面能够盛放众多的JobDetail和trigger,当容器启动后,里面的每一个JobDetail都会根据trigger循序渐进自动去执行。
二、JobDetail是一个可执行的工做,它自己多是有状态的。
三、Trigger表明一个调度参数的配置,何时去调。
四、当JobDetail和Trigger在scheduler容器上注册后,造成了装配好的做业(JobDetail和Trigger所组成的一对儿),就能够伴随容器启动而调度执行了。
五、scheduler是个容器,容器中有一个线程池,用来并行调度执行每一个做业,这样能够提升容器效率。
六、将上述的结构用一个图来表示,以下:
4、总结
一、搞清楚了上Quartz容器执行做业的的原理和过程,以及做业造成的方式,做业注册到容器的方法。就认识明白了Quartz的核心原理。
二、Quartz虽然很庞大,可是一切都围绕这个核心转,为了配置强大时间调度策略,能够研究专门的CronTrigger。要想灵活配置做业和容器属性,能够经过Quartz的properties文件或者XML来实现。
三、要想调度更多的持久化、结构化做业,能够经过数据库读取做业,而后放到容器中执行。
四、全部的一切都围绕这个核心原理转,搞明白这个了,再去研究更高级用法就容易多了。
五、Quartz与Spring的整合也很是简单,Spring提供一组Bean来支持:MethodInvokingJobDetailFactoryBean、SimpleTriggerBean、SchedulerFactoryBean,看看里面须要注入什么属性便可明白了。Spring会在Spring容器启动时候,启动Quartz容器。
六、Quartz容器的关闭方式也很简单,若是是Spring整合,则有两种方法,一种是关闭Spring容器,一种是获取到SchedulerFactoryBean实例,而后调用一个shutdown就搞定了。若是是Quartz独立使用,则直接调用scheduler.shutdown(true);
七、Quartz的JobDetail、Trigger均可以在运行时从新设置,而且在下次调用时候起做用。这就为动态做业的实现提供了依据。你能够将调度时间策略存放到数据库,而后经过数据库数据来设定Trigger,这样就能产生动态的调度。