任务调度是我们平时的业务开发中很常见的需求之一。
Quartz 又是其中十分优秀的框架。
本系列主要是将 Quartz 的官方文档进行简单整理。
希望帮助大家入门。后续如果有时间,再写一点关于 Quartz 的使用心得。
目录导航
入门
Quartz 是一个功能丰富的开源作业调度库,可以集成到几乎任何 Java 应用程序中——从最小的独立应用程序到最大的电子商务系统。
入门案例
maven 引入
org.quartz-scheduler
quartz
2.2.1
quartz是一个用java实现的开源任务调度框架,可以用来创建简单或者复杂的任务调度,并且可以提供许多企业级的功能,比如JTA以及集群等,是当今比较流行的JAVA任务调度框架。
1. 可以用来做什么
Quartz是一个任务调度框架,当遇到以下问题时:
-
想在每月25号,自动还款;
-
想在每年4月1日给当年自己暗恋的女神发一封匿名贺卡;
-
想每隔1小时,备份一下自己的各种资料。
那么总结起来就是,在一个有规律的时间点做一些事情,并且这个规律可以非常复杂,复杂到了需要一个框架来帮助我们。
如果让我们设计一个任务调度系统,会像quartz那样将job、trigger、scheduler解藕吗?quartz这样设计的原因,笔者认为有两点:
job与trigger解藕,其实就是将任务本身和任务执行策略解藕,这样可以方便实现N个任务和M个执行策略自由组合,比较容易理解;
scheduler单独分离出来,相当于一个指挥官,可以从全局做调度,比如监听哪些trigger已经ready、分配线程等等,如果没有scheduler,则trigger间会竞争混乱,难以实现诸如trigger优先级等功能,也无法合理使用资源。
下面,笔者将分别就job、trigger、scheduler进行原理分析。
主要接口定义如下:
Quartz API 的关键接口包括:
-
Scheduler(调度器)- 与调度器进行交互的主要 API。
-
Job(作业)- 由您希望由调度器执行的组件实现的接口。
-
JobDetail(作业详情)- 用于定义作业的实例。
-
Trigger(触发器)- 定义给定作业将被执行的调度时间表的组件。
-
JobBuilder(作业构建器)- 用于定义/构建 JobDetail 实例,这些实例定义了作业的实例。
-
TriggerBuilder(触发器构建器)- 用于定义/构建触发器实例。
虽然您实现的作业类具有知道如何完成特定类型作业的实际工作的代码,但 Quartz 需要了解您可能希望该作业的实例拥有的各种属性。
这是通过JobDetail 类完成的,该类在前一节中简要介绍过。
JobDetail 实例是使用 JobBuilder 类构建的。
您通常希望使用所有方法的静态导入,以便在代码中有 dsl-feel。
import static org.quartz.JobBuilder.*;
和 jobs 一样,触发器也很容易使用,但确实包含了各种可定制的选项,在充分使用Quartz之前,您需要了解并了解这些选项。
另外,正如前面提到的,您可以选择不同类型的触发器来满足不同的调度需求。
后面将会深入讨论: Simple Triggers & Cron Triggers.
Common Trigger Attributes
除了所有触发器类型都有触发键(TriggerKey)属性来跟踪它们的特性之外,还有许多其他属性对所有触发器类型都是通用的。
当您正在构建触发器定义时,这些公共属性设置为 TriggerBuilder (下面的例子将会出现)。
如果您需要在特定的时间内精确地执行一次任务,或者在特定的时间间隔内重复执行某个特定的时间间隔,那么SimpleTrigger应该满足您的调度需求。
举个例子,如果你想在2015年1月13日上午11:23:54的时候触发,或者你想在那个时候触发,然后再触发5次(间隔 10S)。
有了这个描述,您可能不会惊讶地发现一个简单触发器的属性包括:开始时间、结束时间、重复计数和重复间隔。
重复计数可以是零,一个正整数,或者常量值 SimpleTrigger.REPEAT_INDEFINITELY
。
重复的间隔属性必须为零,或正长的值,并表示若干毫秒。注意,重复的零间隔将导致触发器的“重复计数”触发同时发生(或者与调度程序可以同时执行的情况类似)。
CronTrigger 通常比 SimpleTrigger 更有用,如果您需要根据日历类的概念而不是精确指定的简单触发器间隔来重新定义作业调度。
有了CronTrigger,你可以指定诸如“每个周五中午”,或“每个工作日和上午9:30”,甚至“每星期一、星期三和周五上午9:00到10:00之间的每5分钟”。
即使是这样,像SimpleTrigger一样,CronTrigger有一个startTime,它指定调度何时生效,以及一个(可选的)endTime,指定何时停止调度。
Cron 表达式
cron 表达式用于配置 CronTrigger 的实例。cron 表达式是由七个子表达式组成的字符串,它们描述了日程的各个细节。这些子表达式与空白区分开,并表示: