**石英调度介绍**
cron是UNIX系统中很早就有的工具,据证明,它的任务调度很强大。
CronTrigger 这个类就是基于cron的调度能力出现的。它使用"cron表达式"来创建调度任务,比如,“周一至周五的每个早上八点”、“每个月的最后一个周五的凌晨一点半”。
Cron表达式虽然很强大,但是也相当令人困惑,这篇教程旨在揭开部分Cron表达式的面纱,提供用户一个可以查看的资源,而不用去泡论坛或者翻邮件列表。
**格式**
Cron表达式是一个由6或7个、由空格隔开的列组成的字符串,这些列可以包含任意允许的字符,这些允许的字符也可以组合使用。这些可使用的列如下:
Field Name(列名) | Mandatory(是否强制) | Allowed Values(允许值) | Allowed Special Characters(可允许的特殊字符) |
Seconds(秒) | YES(必选) | 0-59 | , - * / |
Minutes(分) | YES(必选) | 0-59 | , - * / |
Hours(时) | YES(必选) | 0-23 | , - * / |
Day of month(日) | YES(必选) | 1-31 | , - * ? / L W |
Month(月) | YES(必选) | 1-12 或者 JAN-DEC | , - * / |
Day of week(星期几) | YES(必选) | 1-7 或者 SUN-SAT | , - * ? / L # |
Year(年) | NO(可选) | empty, 1970-2099 | , - * / |
所以Cron 表达式可以这样简单:* * * * ? *
* ("所有值")-选择一个列中可选择的所有值,比如,对于 “分”这列, * 表示 每一分钟;
? ("非具体值")-当你需要指定两列中的其中一列值(而不是另一列值)时有用!举例来讲,如果我想要触发器在每个月的固定一天(比如第10天)触发,
但是不管触发那天是星期几。这样的话,我就在 “日”那列填入 “10”,而在“星期几”那列填入“?”,具体可以看下面说明;
-(一个英文键盘状态下的中线)-用来表示区间,比如“时”这列的10-12等同于10点,11点,12点;
,(一个英文键盘状态下的逗号) - 表示还有其它的值,比如“星期几”这列中的“MON,WED,FRI”表示星期一、星期二和星期三;
/(表示増量)-比如“秒”这列中的“0/15”表示第0秒、第15秒、第30秒和第45秒,而"5/15"表示第5秒、第20秒,第35秒和第50秒。
你也可以不标明“/”前的数字,这种情况下默认“/”前为数字0。在“日” 这列,'1/3'表示从月的第一天开始 ,第3天触发一次;
L ("最后一个")- 它在不同的列中有不同的意义。比如在“日“这列中它表示最后一天,即1月中的31号,2月中的28号(平年)等等,在星期几
这列中表示 7或者SAT(星期六)。但是需要注意的是,如果"L"前面还有数字,这就表示”月的最后一个星期几,“比如"6L"表示"月的最后一个星期五",
当使用"L"的时候,记得不要列表或者区间,这会使结果混淆;
W ("工作日")-用来指明距离给定日期最近的一个工作日(周一至周五)。比如,在“日”这列"15W"表示 离15号最近的那个工作日,
所以15号是星期六,那么触发器会在14号(周五)触发,如果15号是周日,那么 触发器会在16号(周一)触发,如果15号是星期二,
那么触发器就会在15号(周二)触发。然而,如果把值设为"1W",而1号是星期六,那么触发器会在3号(周一)触发。同样,不要引起混淆。
在 "日"这列中“L”和“W”可以一起使用,即“LW”,表示 月的最后一个工作日;
# - 用来指定“第几个xx”,比如,在“星期几”这列中"6#3" 表示这个月的第3个周五(6 =星期五,而 "#3" = 这个月的第3个),其它例子,
“2#1”-这个月的第1个星期一, "4#5"-这个月的第5个周三。需要注意的是:如果你使用“#5”而没有第5个,那么触发器不会触发了。
最后,允许的字符大小写不敏感,所以MON和mon是一样的啦!
样例:
Expression | Meaning |
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 * * ? | 每天14点到15点之间触发 |
0 0/5 14 * * ? | 每天14点到15点之间,每隔5分钟触发 |
0 0/5 14,18 * * ? | 每天14点到15点之间、18到19点之间,每隔5分钟触发 |
0 0-5 14 * * ? | Fire every minute starting at 2pm and ending at 2:05pm, every day 每天14点到14点零5分之间每分钟触发 |
0 10,44 14 ? 3 WED | Fire at 2:10pm and at 2:44pm every Wednesday in the month of March. 3月份的每个星期三的14点10分和14点44分触发 |
0 15 10 ? * MON-FRI | Fire at 10:15am every Monday, Tuesday, Wednesday, Thursday and Friday 每个工作日(周一至周五)的上午10:15分触发 |
0 15 10 15 * ? | Fire at 10:15am on the 15th day of every month 每月15号的上午10点15分触发 |
0 15 10 L * ? | Fire at 10:15am on the last day of every month 每月最后一天的上午10点15分触发 |
0 15 10 ? * 6L | Fire at 10:15am on the last Friday of every month 每月的最后一个星期五的上午10点15分触发 |
| 对cron还有什么问题吗? |
0 15 10 ? * 6L 2002-2005 | Fire at 10:15am on every last friday of every month during the years 2002, 2003, 2004 and 2005 2002至2005年的每月的最后一个星期五的上午10点15分触发 |
0 15 10 ? * 6#3 | Fire at 10:15am on the third Friday of every month 每月第3个星期五的上午10点15分触发 |
0 0 12 1/5 * ? | Fire at 12pm (noon) every 5 days every month, starting on the first day of the month. 从每月的1号开始,每隔5天,在中午12点整触发 |
0 11 11 11 11 ? | Fire every November 11th at 11:11am. 每个11月11号上午11点11分触发 |
注意 “?”和“*”在“星期几”和 “日”这两列的效果!
而且"?"在它们之间的使用是互斥的,只能使用一个。
留下最后一句,让大家自己翻译吧!
Be careful when setting firetimes between mid-night and 1:00 AM - "daylight savings" can cause askip or a repeat depending on whether the time moves back or jumps forward.