Quartz核心要素有Scheduler、Trigger、Job、JobDetail,其中trigger和job、jobDetail为元数据,而Scheduler为实际进行调度的控制器。
- Trigger
Trigger用于定义调度任务的时间规则,在Quartz中主要有四种类型的Trigger:SimpleTrigger、CronTrigger、DataIntervalTrigger和NthIncludedTrigger。
- Job&Jodetail
Quartz将任务分为Job、JobDetail两部分,其中Job用来定义任务的执行逻辑,而JobDetail用来描述Job的定义(例如Job接口的实现类以及其他相关的静态信息)。对Quartz而言,主要有两种类型的Job,StateLessJob、StateFulJob
- Scheduler
实际执行调度逻辑的控制器,Quartz提供了DirectSchedulerFactory和StdSchedulerFactory等工厂类,用于支持Scheduler相关对象的产生。
从上图可以知道:
1、从工厂获取Scheduler调度器
2、把作业JobDetail和触发时间放进调度器Scheduler里面
3、调度器Scheduler启动后,自然而然的会去处理Job,因为JobDetail里面描述了Job的实现类是哪一个。
4、从上面元素可以知道Job定义执行逻辑。也就是我们要在Job.execute中完成怎样调用业务代码地方.
关键问题:
1、调度进程什么时候启动?
在调用scheduler.start()之后,将QuartzSchedulerThread的pause状态设为false,通知调度线程执行任务,此后调度线程不停的从JobStore中去取即将触发的任务。
2、怎么判断任务开始执行的时间点,以及在哪里判断?
有调度器QuartzSchedulerThread获取30秒内的触发器Trigger,等到时间误差小于2等于ms开始执行JOb。即有scheduleer.start()启动调度线程,然后调度线程去获取已保存的jobdetail和trigger判断是否可执行,可以就执行jobdetail里描述的job实现类的execute方法
3、时间表达式怎么解析?
有trigger对象负责时间表达式的解析,解析结果是下一次执行时间的毫秒数。
4job的execute方法有谁来调用?
由框架的JobRunShell 来完成调用,属于调度框架的内置逻辑,我们只需集成Job接口实现execute方法即可。