Java作业调度/定时任务 Spring和Quartz整合

时间:2021-09-05 21:49:06
作业调度Quartz使用手册

Quartz简介

简介

Quartz是一个完全由Java编写的开源作业调度框架,是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与JEE应用程序相结合也可以单独使用。Quartz可以用来创建简单的作业,也可以为运行十个、百个、甚至是好几万个Jobs这样复杂的程序服务。

下载与安装

下载

直接访问Quartz的官方网站下载:

http://www.quartz-scheduler.org/downloads/

打开下载页面,下载最新的发布版本:

Java作业调度/定时任务 Spring和Quartz整合

在下载页面也有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

Java作业调度/定时任务 Spring和Quartz整合

2、在Quargz的配置文件spring-quartz.xml中配置好调度器、触发器、JobDetail、Job。

Java作业调度/定时任务 Spring和Quartz整合

配置文件spring-quartz.xml详解

Quartz有二种配置方式,一种的作业需要实现一个Job接口,另外一种不需要实现任何接口也不需要继承任何类。这里的配置采用更为灵活的第二种方式,主要分成四大块:

配置Job

Job是业务逻辑的载体,在这里不需要继承类也不需要实现什么接口,和普通的类没什么分别,对方法名称也没要求,Job会被JobDetail包装:

Java作业调度/定时任务 Spring和Quartz整合

配置JobDetail

JobDetail对Job进行包装,是被触发器触发的对象。在这里可以定义好执行的方式和行为,可指定名称和所属组,指定是否允许并发运行,指定目标Job中要被调度的是哪个方法:

Java作业调度/定时任务 Spring和Quartz整合

配置触发器

触发器负责触发目标JobDetail,其中一个最重要的属性是触发频率,这里采用的是cronExpression表达式的形式,此外还有一种简单些的形式,简单但不如cron灵活。Cron在这里的用法和Linux下的crontab区别不大,只是时间的颗粒度、日期和星期的配置方法略有不同:

Java作业调度/定时任务 Spring和Quartz整合

配置调度工厂

调度器负责调度触发器,触发器负责触发JobDetail,环环配合完成作业的调度,Quartz本身的配置文件一般也是在这里加载:

Java作业调度/定时任务 Spring和Quartz整合

Quartz.properties

可定制调度器的名称,线程池中线程的数量,优先级等信息,可依需要改动,这里采用默认的配置文件:

Java作业调度/定时任务 Spring和Quartz整合

 

场景一:更改作业调度频率

更改调度频率的方法

在介绍触发器时提到过,触发器一个最重要的属性是触发频率,这里采用的是cronExpression表达式的形式,所以如果想要更改作业调度的频率,就需要更改作业所在的触发器的cronExpression属性,在 value的内容中填写符合cron规则和业务要求的表达式。见下图:

Java作业调度/定时任务 Spring和Quartz整合

 

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"前只能设置具体的数字,不允许区间"-");

字符可用于“日”和“周几”字段,它是"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需要重启,新的作业才会生效。