一、quartz的基本认识
1. 什么是quartz
从quartz的官网可首页可以看到对quartz的简单介绍,下面翻译成中文,大概就是这样:
Quartz是一个功能丰富的开源作业调度库,几乎可以集成到任何Java应用程序中——从最小的独立应用程序到最大的电子商务系统。Quartz可用于创建简单或复杂的时间表,以执行数十个、数百个甚至数万个作业;其任务被定义为标准Java组件的作业,这些组件可以执行几乎任何您可以对其进行编程的操作。Quartz调度器包括许多企业级功能,例如支持JTA事务和集群。
2. quartz的基本组件
从上图可以看出,quartz主要包含了3个基本组件:Scheduler、Job和Trigger,其中, Job部分包含了组件Job、JobDetail和JobBuilder,Trigger部分包含了Trigger和TriggerBuilder。
一个设计良好的组件或者框架,必然会遵守组件的职责区分,单一职责原则是面向对象的一个重要特性,不仅在编码中需要注意,在组件或者框架的设计中也必然需要考虑到这一点。
首先是Job。Job从字面意思上理解,就是一项工作或者任务,也就是定时任务的“任务”具体需要做什么,在quartz中,Job是一个接口,且只定义了一个方法execut(),把任务需要处理的逻辑写在execute方法中。同时我们需要注意的一点是,Job是无状态的,也就是Job是可以复用的,那么Job需要的信息从哪里来呢?答案是从JobDetail中获取,JobDetail有一个重要的方法getJobDataMap(),调用这个方法可以获取到任务需要的相关信息,当然这些信息一般是创建Job的时候设定的。现在引申出另外一个问题,那就是如何创建一个Job?一想到创建,我们肯定会想到建造者模式,quartz就使用JobBuilder来创建Job,并设定Job需要的相关信息。
然后看Trigger。我们定义完任务之后,那么什么时候触发呢?所以我们需要一个“任务触发器”,来定时触发Job。比如:每多少分钟执行一次,或者根据cron表达式来定时执行等等。那么TriggerBuilder就是用来协助创建Trigger的类。
最后是Scheduler。现在任务和触发器都有了,那么谁来调度呢?这时候就需要一个调度器了,调度器负责协调任务和触发器,当触发任务时,把上下文传递给具体的任务,任务拿到上下文,执行任务。
二、quartz实战
1. quartz的基本使用
public class SimpleQuartzTest {
public static void main(String[] args) throws Exception{
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
JobDetail jobDetail = JobBuilder.newJob(MySimpleJob.class)
.withIdentity("myJob", "myGroup")
.usingJob