Quartz是一个开源的作业调度框架,由美国Terracotta公司收购,旗下还收购有Java开源的缓存项目Ehcache
。Quartz可以与Java EE、Java SE应用程序结合或者单独使用。现研究版本为2.2.x。
概念
核心元素
Quartz 任务调度的核心元素是 scheduler
, trigger
和 job
,其中 trigger 和 job 是任务调度的元数据,scheduler 是实际执行调度的控制器。下面是几个概念:
概念 | 描述 |
---|---|
scheduler | 任务调度器 |
trigger | 触发器,用于定义任务调度时间规则 |
job | 任务,即被调度的任务 |
misfire | 错过的,指本来应该在指定的触发时间执行但实际没有被执行的任务调度 |
他们的关系图为:
调度工厂负责创建任务调度类,由任务调度类进行任务调度。由Job实现类实现具体的作业任务逻辑,具体任务的触发由触发器定义触发规则。一个任务可以同时由多个触发器规则定义。触发器定义了任务的调度周期、频率等触发规则。
代码参见
触发器接口类:org.quartz.Trigger
调度器接口类:org.quartz.Scheduler
调度器工厂接口类:org.quartz.SchedulerFactory
作业任务接口类:org.quartz.Job
标准调度器工厂:org.quartz.impl.StdSchedulerFactory
标准调度器:org.quartz.impl.StdScheduler
触发器类型
Quartz 中主要提供了四种Trigger触发器实现接口类型:
SimpleTrigger、CronTirgger、CalendarIntervalTrigger、DailyTimeIntervalTrigger
下面是触发器类型的简要描述:
触发类型 | 描述 |
---|---|
SimpleTrigger | 简单触发器。一般适用于周期性任务,可指定开始时间、时间间隔和重复次数,重复次数-1表示无限次数,可能受到触发任务的影响 |
CronTirgger | Cron表达式触发器。类似LINUX上的任务调度命令 crontab,使用Cron表达式来表示时间调度方式,参见【4、4、4 Cron 表达式】 |
CalendarIntervalTrigger | 日历触发器。基于日历的时间间隔。适用于每N(getRepeatInterval())日历时间单元。例如,每5个月执行。如果是每月月底或最后几天应该用CronTrigger |
DailyTimeIntervalTrigger | 日期触发器。最适合调度类似每 N(getRepeatInterval())秒,分,时等任务,可指定每周特定的星期。例一,每天8:00-11:00每72分触发。那么每天都是8:00, 9:12, 10:24触发。例二,每周工作日(星期一到星期五)9:20-16:47 每23分触发。 |
下面是触发器层级关系图:
代码参见
触发器主要计算前次触发时间、下次触发时间和错过触发任务处理策略,触发器还有优先级定义等等
存储方式
Quartz还定义了Job和Trigger的存储方式,决定是否持久化等等。可以在默认的配置文件quartz.properties
文件中指定存储方式,下面是主要的存储方式。
1、RAMJobStore
:默认设置,将作业数据保存在内存中,可以说是最快的,主要不足是缺乏数据的持久性。当应用程序或系统崩溃时,所有信息都会丢失,Quartz的所有的工作数据都必须重建。配置:
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
2、JDBCJobStore
:能够持久化作业数据到数据库中。程序重启时可以恢复Quartz,支持各种主流数据库。但同时带来性能的降低和复杂性的提高。配置:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
3、TerracottaJobStore
:使用Terracotta server(分布式缓存)存储数据,性能介于前两者之间。这里前提需要搭建Terracotta缓存集群。配置:
org.quartz.jobStore.class = org.terracotta.quartz.TerracottaJobStore org.quartz.jobStore.tcConfigUrl: localhost:9510
此外还有一些第三方的JobStore,可以使用Nosql持久化数据,如redis,mongodb等等。
代码参见
任务存储接口类:org.quartz.spi.JobStore
主要定义了Job的存储、删除、暂停、恢复和Trigger的CRUD操作,还有其他额外的方法等等等等。
当然,Quartz还提供了监听器和插件的扩展。还有更多的介绍可以移步官网
参考
官网:http://www.quartz-scheduler.org/
github:https://github.com/quartz-scheduler/quartz
发表评论