Quartz简介
Quartz是OpenSymphony开源组织在Job scheduling领域又一个功能丰富的,开放源码的作业调度项目,完全基于java实现,可集成到几乎所有的Java应用程序中。Jobs可以是任何自定义的业务逻辑。Quartz可以用来创建简单或复杂的调度器,用来执行数十成百上千甚至上万个Jobs。
优势及概念
作为一个优秀的开源调度框架,Quartz 具有以下特点:
强大的调度功能,例如支持丰富多样的调度方法,可以满足各种常规及特殊需求;
灵活的应用方式,例如支持任务和调度的多种组合方式,支持调度数据的多种存储方式;
分布式和集群能力,Terracotta 收购后在原来功能基础上作了进一步提升。本文暂不讨论该部分内容
另外,作为 Spring 默认的调度框架,Quartz 很容易与 Spring 集成实现灵活可配置的调度功能。
下面是本文中用到的一些专用词汇,在此声明:
scheduler:
任务调度器
trigger:
触发器,用于定义任务调度时间规则
job:
任务,即被调度的任务
misfire:
错过的,指本来应该被执行但实际没有被执行的任务调度
key:
由名称(name)和分组(group)组成,将Job和Trigger注册到Scheduler时,需要为它们设置key
核心组件
1.核心组件关系图
2.核心组件逻辑关系
任务调度器(scheduler)在触发器(trigger)指定的时刻调度任务(job)。
3.组件工作过程
1).Scheduler在使用之前需要实例化。一般通过SchedulerFactory来创建一个实例。
SchedulerFactory sf=new StdSchedulerFactory();
Scheduler sched=sf.getScheduler();
StdSchedulerFactory创建出一个简单的调度器,采用RAMJobStore存储方式 ,将 trigger 和 job 存储在内存中。
2).创建一个任务用于执行特定业务。
JobDetail job = newJob(HelloJob.class).withIdentity("myJob", "group1").build();
其中HelloJob是自定义的实现Job接口业务类,是无状态的(stateless)的任务,可以被并行执行,即二次调度不受上次调度是否执行完毕影响。
3).创建一个触发器,用于指定在何时执行任务,此处使用CronTirgger。
CronTrigger trigger=newTrigger()
.withIdentity("trigger1","group1")
.withSchedule(cronSchedule("0/20 * * * * ?"))
.build();
CronTirgger 类似于 LINUX 上的任务调度命令 crontab,即利用一个包含 7 个字段的表达式来表示时间调度方式。例如,"0 15 10 * * ? *" 表示每天的 10:15AM 执行任务。对于涉及到星期和月份的调度,CronTirgger 是最适合的,甚至某些情况下是唯一选择。例如,"0 10 14 ? 3 WED" 表示三月份的每个星期三的下午 14:10PM 执行任务。
4)注册任务与触发器到任务调度器
scheduler.scheduleJob(job, trigger);
Key
将Job和Trigger注册到Scheduler时,可以为它们设置key,配置其身份属性。Job和Trigger的key(JobKey和TriggerKey)可以用于将Job和Trigger放到不同的分组(group)里,然后基于分组进行操作。同一个分组下的Job或Trigger的名称必须唯一,即一个Job或Trigger的key由名称(name)和分组(group)组成。