cron表达式是一个已经存在了很长时间的UNIX工具,因此它的调度功能非常强大且已经经过验证。CronTrigger类的功能是基于cron的调度功能实现的。
CronTrigger
使用"cron表达式",可以创建诸如“每周一至周五上午8:00”或“每月最后一个星期五上午1:30”的触发调度时间表(调度计划)。
cron表达式很强大,但是它使用起来也有可能相当混乱(这里大概的意思是说cron的用法相对复杂,容易出错)。本教程旨在解决创建cron表达式的一些谜题,为用户提供一个资源,让他们可以在论坛或邮件列表中提问之前访问这个教程(减少在论坛或者邮件中的提问)。
cron表达式是由空格分隔的6或7个字段组成的字符串。字段可以包含任何允许的值,以及该字段允许的特殊字符的各种组合。这些字段如下所示:
字段名称 | 是否必须 | 允许的值 | 允许的特殊字符 |
---|---|---|---|
秒种(Seconds) | 是 | 0-59 | , - * / |
分钟(Minutes) | 是 | 0-59 | , - * / |
小时(Hours) | 是 | 0-23 | , - * / |
日(Day of month) | 是 | 1-31 | , - * ? / L W |
月(Month) | 是 | 1-12 or JAN-DEC | , - * / |
星期(Day of week) | 是 | 1-7 or SUN-SAT | , - * ? / L # |
年(Year) | 否 | empty(也就是不填任何值), 1970-2099 | , - * / |
译者注:这里可以看出一个cron表达式中年(Year)字段是非必须的,如果不填写此字段可以认为它其实就是*
值。
所以cron表达式可以像这样简单:* * * * ? *
,或更复杂,如这个例子所示:0/5 14,18,39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010
。
注意:
'L'和'W'字符可以Day of month字段合并使用,也就是在Day of month字段中使用'LW',转换为“月份的最后一个工作日”。
例如:"0 0 12 1LW * ?"表示每个月的最后一个工作日中午12点触发。
注意:
月份和星期缩写对应的合法字符不区分大小写。例如:MON与mon相同。
这里有一些完整的例子:
表达式 | 含义 |
---|---|
0 0 12 * * ? | 每天中午12点(中午)触发 |
0 15 10 ? * * | 每天上午10点15分触发 |
0 15 10 * * ? | 每天上午10点15分触发 |
0 15 10 * * ? * | 每天上午10点15分触发 |
0 15 10 * * ? 2005 | 2005年每天上午10点15分触发 |
0 * 14 * * ? | 每天下午2点开始,每天下午2点59分结束 |
0 0/5 14 * * ? | 每天下午2点开始,每天下午2点55分结束,每5分钟触发一次 |
0 0/5 14,18 * * ? | 从下午2点开始,每天5分钟触发,结束于下午2点55分,每天5点钟触发,每天晚上6点开始,结束于下午6点55分 |
0 0-5 14 * * ? | 每天下午2点开始,结束于下午2点05分,每分钟触发 |
0 10,44 14 ? 3 WED | 在3月份的每个星期三下午2点10分和下午2点44分触发 |
0 15 10 ? * MON-FRI | 每周一,周二,周三,周四和周五上午10点15分触发 |
0 15 10 15 * ? | 在每个月的第15天上午10点15分触发 |
0 15 10 L * ? | 在每个月的最后一天上午10点15分触发 |
0 15 10 L-2 * ? | 在每个月的倒数第二天的上午10点15分触发 |
0 15 10 ? * 6L | 每个月的最后一个星期五上午10点15分触发 |
0 15 10 ? * 6L 2002-2005 | 2002年,2003年,2004年和2005年每个月的最后一个星期五上午10点15分触发 |
0 15 10 ? * 6#3 | 每个月的第三个星期五上午10点15分触发 |
0 0 12 1/5 * ? | 从每月的第一天开始,每个月每隔5天下午12点(中午)触发 |
0 11 11 11 11 ? | 每11月11日上午11点11分触发 |
注意:
请注意'?'和'*'在日(Day of month)和星期(Day of week)中的作用。