# 专题之Corn触发器教程
# 介绍
cron是一种已经存在很长时间的UNIX工具,因此它的调度功能非常强大,并且得到了验证。CronTrigger
类基于cron的调度功能。
CronTrigger
使用“cron表达式”,可以创建触发时间表,例如:“每周一至周五上午8:00”或“每月最后一个周五凌晨1:30”。
cron表达式很强大,但也很容易混淆。本教程旨在揭开创建cron表达式的神秘面纱,为用户提供一个资源,用户可以在论坛或邮件列表中询问之前访问该资源。
# 格式
cron表达式是由6个或7个字段组成的字符串,用空格分隔。字段可以包含任何允许的值,以及该字段允许的特殊字符的各种组合。字段如下:
字段名称 | 是否必须 | 允许的值 | 允许的特殊字符 |
---|---|---|---|
秒【Seconds】 | 是 | 0-59 | , - * / |
分【Minutes】 | 是 | 0-59 | , - * / |
时【Hours】 | 是 | 0-23 | , - * / |
一月中的某天【Day of month】(简:月天) | 是 | 1-31 | , - * ? / L W |
月【Month】 | 是 | 1-12 或 JAN-DEC | , - * / |
一周中的某天【Day of week】(简:周天) | 是 | 1-7 或 SUN-SAT | , - * ? / L # |
年【Year】 | 否 | 空,或1970-2099中的某个值 | , - * / |
所以cron表达式可以这么简单:* * * * ? *
或更复杂,如:0/5 14,18,3-39,52 * ? JAN,MAR,SEP MON-FRI 2002-2010
# 特殊符号
*(“所有值”)——用于选择字段中的所有值。例如,分钟字段中的“*”表示“每分钟”。
? (“无特定值”)——当您需要在允许字符的两个字段中的一个字段中指定某些内容,但不允许另一个字段时非常有用。例如,如果我想在一个月的某一天(例如,10日)触发触发器,但不在乎这是一周中的哪一天,我会在“月天(Day of month)”字段中输入“10”,在“周天(Day of week)”字段输入“?”。请参见下面的示例进行说明。
-(“范围”)——用于指定范围。例如,小时字段中的“10-12”表示“小时10、11和12”。
,(“其它”)——用于指定其它值。例如,“星期几”字段中的“MON,WED,FRI”表示“星期一、星期三和星期五”。
/(“增量”)——用于指定增量。例如,秒字段中的“0/15”表示“秒0、15、30和45”。秒字段中的“5/15”表示“秒5、20、35和50”。还可以在“”字符之后指定“/”——在这种情况下,“”相当于在“/”之前指定“0”。“月天(Day of month)”字段中的“1/3”表示“从该月的第一天开始,每3天进行一次触发”。
L(“最后”)——在允许的两个字段中具有不同的含义。例如,“月天(Day of month)”字段中的值“L”表示“一个月的最后一天”——1月的第31天,非闰年的2月的第28天。如果在“周天(Day of week)”字段中单独使用,它只表示“7”或“SAT”。但如果在某一个值之后“周天(Day of week)”的字段,则表示“该月的最后xxx天”——例如“6L”表示“该月中的最后一个星期五”。您还可以指定从当月最后一天开始的偏移量,例如“L-3”,这意味着日历月的第三天到最后一天。使用“L”选项时,重要的是不要指定列表或值范围,因为您会得到令人困惑/意外的结果。
W(“工作日”)——用于指定最接近给定日期的工作日(周一至周五)。例如,如果要指定“15W”作为“月天(Day of month)”字段的值,则其含义为:“最接近该月15日的工作日”。因此,如果15日是星期六,触发器将在14日星期五启动。如果15日是星期天,触发器将在16日星期一启动。如果15日是星期二,那么它将在15日星期二触发。但是,如果您指定“1W”作为一个月中的一天的值,并且第1天是星期六,则触发器将在第3天的星期一触发器,因为它不会“跳过”一个月的日期边界。“W”字符只能在一个月的某一天,而不是一个日期范围或列表时指定。
“L”和“W”字符也可以在“月天(Day of month)”字段中组合,以生成“LW”,即“当月最后一个工作日”。
#(“第”)——用于指定当月的“第n”天。例如,“周天(Day of week)”字段中的值“6#3”表示“当月的第三个星期五”(6=星期五,“#3”=当月的第3个)。其他示例:“2#1”=当月的第1个星期一,“4#5”=当月第5个星期三。请注意,如果您指定“#5”,并且该月中给定的一周中没有5天,那么该月将不会发生触发。
法定字符以及一周中的月和日的名称不区分大小写。
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点至下午2点55分,每5分钟触发一次;下午6点至下午6点55分,每5分钟触发一次 |
0 0-5 14 * * ? | 每天下午2点开始,下午2点05分结束,每分钟触发一次 |
0 10,44 14 ? 3 WED | 三月每周三下午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 * ? | 每月2日至最后一天上午10:15触发 |
0 15 10 ? * 6L | 每月最后一个星期五上午10:15触发 |
0 15 10 ? * 6L 2002-2005 | 2002年到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 week)”和“月天(Day of month)”的影响!
# 注意
对指定“周天(Day of week)”和“月天(Day of month)”值的支持不完整(您当前必须在其中一个字段中使用“?”字符)。
当您的区域设置发生“夏时制”变化时,请在早晨的几个小时之间设置触发时间(对于美国区域设置,这通常是凌晨2:00之前和之后的一个小时),因为时间偏移可能会导致跳跃或重复,这取决于时间是向后移动还是向前移动。此维基百科条目可能有助于帮助您确定区域设置的具体内容: https://secure.wikimedia.org/wikipedia/en/wiki/Daylight_saving_time_around_the_world (opens new window)
温馨提示
至此,您已学完Quartz教程的相关内容,如果想要了解更多关于Quartz的代码示例,请学习第三章、15个官网示例,或者您可以直接放弃以后的内容,并在实践中使用Quartz。
← 12.Quartz的其他特征 0.示例概览 →

微信公众号

QQ交流群
如若发现错误,诚心感谢反馈。
愿你倾心相念,愿你学有所成。
愿你朝华相顾,愿你前程似锦。