天天看点

Quartz 里的触发器及Cron 表达式

Quartz 的设计允许作业与作业调度分离。将作业与作业调度的分离通过触发器完成,

Quartz 中的触发器用来确定作业的触发时机,其框架提供了一系列触发器类型,但以下

两个是最常用的:

• SimpleTrigger 。

• CronTrigger 。

SimpleTrigger 主要用于简单的调度。例如,如果需要在给定的时间内重复执行作业,

或者间隔固定时间执行作业,可以选择SimpleTrigger 0 SimpleTrigger 类似与JDK 的Timer 。

如果需要更复杂的作业调度,则可以考虑使用CronTrigger 。该调度器基于

Calendar-like 调度。当需要在除星期六和星期日以外的每天上午10: 30 执行作业时,就

应使用CronTrigger 0 CronTrigger 是基于Unix Cron 的表达式。

Cron 表达式是一个字符串,字符串以5 个或6 个空格隔开,分成6 个或7 个域,每

个域代表一个时间域, Cron 表达式有如下两种语法格式。

Seconds Minutes Hours DayofMonth Month DayotWeek ¥ear 。

上面是包含7 个域的表达式,还有只包含6 个域的Cron 表达式。

Seconds Minutes Hours DayofMonth Month DayotWeek

每个域可出现的字符如下。

• Second: 可出现, - * /四个字符,有效范围为0-59 的整数。

• Minutes: 可出现, - * /四个字符,有效范围为0-59 的整数。

• Hours: 可出现, - * /四个字符,有效范围为0-23 的整数。

• DayofMonth: 可出现, -*?/LWC 八个字符,有效范围为1-31 的整数。

• Month: 可出现, - * /四个字符,有效范围为1-12 或JAN-DEC 。

• DayotWeek: 可出现, -*?/LC# 八个字符,有效范围为1-7 或

SUN-SAT 两个范围。其中1 表示星期日, 2 表示星期一,依次类推。

• Year: 可出现, - * /四个字符,有效范围为1970-2099 年。

每个域通常都使用数字,但还可以出现如下特殊字符,它们的含义如下。

• * :表示匹配该域的任意值,假如在Minutes 域使用*,即表示在每分钟都会触发

事件。

518

完整应用2 简单工作流系统

• ? :只能用在DayotMonth 和DayofWeek 两个域。它也匹配该域的任意值,但实

际应用中则不会,因为DayOtMonth 和DayofWeek 会互相影响。例如,想在每月

的20 日触发调度,无论20 日是星期几,则只能使用如下写法: 13 13 15 20 * ?,

其中最后→位只能使用?,而不能使用*,如果使用*则表示无论星期几都会触发,

但实际并不是这样。

• - :表示范围。例如,在Minutes 域使用5-20 ,表示从5 分钟到20 分钟内每分钟

触发一次。

• I : 表示从起始时间开始触发,然后每隔固定时间触发一次。例如,在Minutes

域使用5/20 , 则意味着5 分钟触发一次,而在25 , 45 等分钟时分别触发一次。

·,:表示列出枚举值。例如,在Minutes 域使用5 , 20 ,则意味着在5 和20 分钟

分别触发一次。

• L :表示最后。只能出现在DayofWeek 和DayotMonth 域,如果在DayofWeek 域

使用丸,则意味着在最后一个星期四触发。

·W: 表示有效工作日(星期二到星期五)。只能出现在DayotMonth 域,系统将

在离指定日期最近的有效工作日触发事件。例如,在DayotMonth 使用5W ,如果

5 日是星期六,则将在最近的工作日星期一,即4 日触发。如果5 日是星期一到

星期五中的一天,则就在5 日触发。须注意的是, W 不会跨月寻找,例如, lW,

1 日恰好是星期六,系统不会在上月的最后一天触发,而是到3 日触发。

• LW: 这两个字符可以连接使用,表示某个月最后→个工作日,即最后一个星期五。

• # :用于确定每个月的第几个星期几,只能出现在DayotMonth 域。如在4#5 ,

表示某月的第五个星期三。

下面的Quartz Cron 表达式,表示在周一到周五的每天上午10: 15 分开始执行作业。

o 15 10 ? * MON-FRI

下面的表达式,表示在2002-2005 年中的每个月的最后一个星期五上午10: 15 分

开始执行作业。

o 15 10 ? * 6L 2002-2005