Quartz简介
简介
Quartz是一个完全由Java编写的开源作业调度框架,是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与JEE应用程序相结合也可以单独使用。Quartz可以用来创建简单的作业,也可以为运行十个、百个、甚至是好几万个Jobs这样复杂的程序服务。
下载与安装
下载
直接访问Quartz的官方网站下载:
http://www.quartz-scheduler.org/downloads/
打开下载页面,下载最新的发布版本:
在下载页面也有Maven的配置片段,如果是Maven工程可以参考,在下载页面上有1.x.x和2.x.x版本的下载链接。
安装
在Quartz的官方网站上有快速入门介绍:
http://www.quartz-scheduler.org/
安装时有一个核心包必不可少,另外几个则依需要添加:
quartz-x.y.z.jar(核心包,必选)
sl4j-api jar(日志包,必选)
the c3p0 library(数据源,可选)
quartz-jobs jar(多样化的作业,可选)
安装方法:把需要的jar包放入到工程的类路径CLASSPATH下即可。
与Spring整合
目前Quartz有二大系列,分别为1.x.x和2.x.x,一般在企业的应用中都会与spring整合使用,这时就需要注意spring的版本,如果是3.0的最好下载1.x.x版本的Quartz,以避免版本兼容问题,导致这个麻烦的原因是Quartz在2.x.x版本中调整过1.x.x版本中的一个类和接口名称。
与Spring整合推荐使用单独的配置文件,分二步:
1、在spring配置文件中import Quartz的配置文件,配置文件名称为spring-quartz.xml
2、在Quargz的配置文件spring-quartz.xml中配置好调度器、触发器、JobDetail、Job。
配置文件spring-quartz.xml详解
Quartz有二种配置方式,一种的作业需要实现一个Job接口,另外一种不需要实现任何接口也不需要继承任何类。这里的配置采用更为灵活的第二种方式,主要分成四大块:
配置Job
Job是业务逻辑的载体,在这里不需要继承类也不需要实现什么接口,和普通的类没什么分别,对方法名称也没要求,Job会被JobDetail包装:
配置JobDetail
JobDetail对Job进行包装,是被触发器触发的对象。在这里可以定义好执行的方式和行为,可指定名称和所属组,指定是否允许并发运行,指定目标Job中要被调度的是哪个方法:
配置触发器
触发器负责触发目标JobDetail,其中一个最重要的属性是触发频率,这里采用的是cronExpression表达式的形式,此外还有一种简单些的形式,简单但不如cron灵活。Cron在这里的用法和Linux下的crontab区别不大,只是时间的颗粒度、日期和星期的配置方法略有不同:
配置调度工厂
调度器负责调度触发器,触发器负责触发JobDetail,环环配合完成作业的调度,Quartz本身的配置文件一般也是在这里加载:
Quartz.properties
可定制调度器的名称,线程池中线程的数量,优先级等信息,可依需要改动,这里采用默认的配置文件:
场景一:更改作业调度频率
更改调度频率的方法
在介绍触发器时提到过,触发器一个最重要的属性是触发频率,这里采用的是cronExpression表达式的形式,所以如果想要更改作业调度的频率,就需要更改作业所在的触发器的cronExpression属性,在 value的内容中填写符合cron规则和业务要求的表达式。见下图:
cronExpression表达式
cronExpression表达式的规则如下:
完整格式为: [秒] [分] [小时] [日] [月] [周] [年]
序号 |
说明 |
是否必填 |
允许填写的值 |
允许的通配符 |
1 |
秒 |
是 |
0-59 |
, - * / |
2 |
分 |
是 |
0-59 |
, - * / |
3 |
小时 |
是 |
0-23 |
, - * / |
4 |
日 |
是 |
1-31 |
, - * ? / L W C |
5 |
月 |
是 |
1-12 or JAN-DEC |
, - * / |
6 |
周 |
是 |
1-7 or SUN-SAT |
, - * ? / L C # |
7 |
年 |
否 |
empty 或 1970-2099 |
, - * / |
通配符说明:
* 表示所有值. 例如:在分的字段上设置"*",表示每一分钟都会触发;
? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ? ;
- 表示区间。例如在小时上设置 "10-12",表示 10,11,12点都会触发;
, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发;
/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次;
L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个;例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"
W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-");
C 字符可用于“日”和“周几”字段,它是"calendar"的缩写。它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历,那它等同于包含全部日历。“日”字段值为"5C"表示"日历中的第一天或者5号以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日以后";
# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了) 。
常用cronExpression表达式
常用示例:
0 0 12 * * ? |
每天12点触发 |
0 15 10 ? * * |
每天10点15分触发 |
0 * 14 * * ? |
每天下午的 2点到2点59分每分触发 |
0 0-5 14 * * ? |
每天下午的 2点到2点05分每分触发 |
0 15 10 ? * MON-FRI |
从周一到周五每天上午的10点15分触发 |
0 15 10 L * ? |
每月最后一天的10点15分触发 |
0 15 10 ? * 6#3 |
每月的第三周的星期五开始触发 |
0 0 12 1/5 * ? |
每月的第一个中午开始每隔5天触发一次 |
场景二:新增作业
按以下步骤进行
开发Job:
先写好业务逻辑;
配置一个新的触发器:
更改spring-quartz.xml配置文件,加入一个触发器,按上述4.3节所介绍的方式设置好触发频率;
将触发器加入调度工厂:
在调度工厂的list下加入触发器,参考上述4.4节;
重启生效:
Tomcat需要重启,新的作业才会生效。