1. 简介
Spring提供的轻量级调度框架中,任务的调度通过Trigger接口来实现。Trigger接口的一种实现便是基于CRON表达式的。 但是这里的CRON表达式与Linux系列操作系统中crobjob的表达式不一样,需要特别注意。
在使用注解进行调度的时候,一种写法如下:
@Schedule (cron="cron expression")
public void doEtlJob(){
...
}
- 1
- 2
- 3
- 4
其中被注解的方法不能有任何返回值(也就是必须为void)和方法参数。
2. 表达式格式
不同于Linux中的cron表达式(5位或者6位),Spring的表达式格式与QuartZ的格式类似,具体如下:
cron表达式由6位或者7位空白符号隔开的字符组成,各位的含义如下:
1. 秒数
2. 分钟
3. 小时
4. 月份中的日期
5. 月份
6. 星期
7. 年份
每一位可以指定值(如6),范围(9-12),或者逗号隔开的列表(5,6,7)。
其中,第4位和第6位是互斥的,只有指定一位,不指定的那一位使用问号?来表示。
第7位的年份可以省略。
例如:
0 30 01 * * ?
- 1
表示每天的凌晨1点30执行指定的任务。
更具体的总结如下:
位数 | 字段 | 是否必须 | 取值范围 | 允许的特殊字符 |
---|---|---|---|---|
1 | 秒 | 是 | 0-59 | , - * / |
2 | 分 | 是 | 0-59 | , - * / |
3 | 小时 | 是 | 0-23 | , - * / |
4 | 日期 | 是 | 1-31 | , - * / ? L W |
5 | 月份 | 是 | 1-12,或JAN-DEC(不区分大小写) | , - * / |
6 | 星期 | 是 | 1-7,或SUN-SAT(不区分大小写) | , - * / ? L # |
7 | 年 | 否 | 空,或1970-2099 | , - * / |
特殊字符:
*
对应字段上的所有值,例如在分钟字段,表示每一分钟。相应的有每一秒,每个月,每一年等。?
表示该字段不设置。在两个字段只能选其一的情况下使用,例如日期和星期只能出现一个,那个不使用的那个字段就设置为?-
用于设置范围,上下界都包含,例如月份字段8-10,表示8,9,10三个月份。,
表示列表值(多值),如MON,WED,FRI 表示周一周三周五,当取值不连续无法使用范围时,使用该字段。/
配置步长/增量. 格式为 开始/步长. 在秒位置上配置为0/15,表示从0来时,15为单位增加,在取值范围内的所有值,即0,15,30,45.
如果开始设置为5,即5/15,则取值为5,20,35,50
如果开始未知为*,等效于0或者其他起始值L
表示最后一个可选值。例如在日期中表示月份的最后一天,30号或31号或28号,根据月份年份不同。星期中表示星期中的最后一天,即7或者SAT。
在星期中设置为6L,表示月份的最后一个星期五(6表示)
L-3表示倒数第三天(third-to-last)W
只用于日期字段。weekday,周一到周五,表示离当前最近的工作日。例如在日期字段配置为15W,表示离15号最近的工作日。所以如果15号是星期六,则将在14号星期五触发。如果15号是星期二,那会在15号星期二触发。
注意在计算最近工作日的时候,不会跨越日期。例如1W,并且1号为星期六,则将在该月的3号触发,而不会跳到上一个月的最后一天星期五。
W用于配置月份中的特定一天,不能出现在多天的情况下。
如果W和L一起使用在日期字段,即LW,则表示月份的最后一个工作日。#
只用于星期字段,例如6#3表示第三个周五(6为周五,#3表示第三个星期)。 2#1表示第一个周一。
如果你设置#5但是没有第五周,则不会触发。
3. 例子
表示式 | 含义 |
---|---|
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点的每一分钟,即14:00-14:59的每一分钟 |
0 0/5 14 * * ? | 每天14点的0,5,10,15,20,25,30,35,40,45,50,55分 |
0 0/5 14,18 * * ? | 每月18号的14点和18点的0,5,10,15,20,25,30,35,40,45,50,55分 |
0 0-5 14 * * ? | 每天14点的0,1,2,3,4,5分 |
0 10,44 14 ? 3 WED | 每年3月份每周三的14:10和14: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,如5月的29号 |
0 15 10 ? * 6L | |
0 15 10 ? * 6L 2002-2005 | 2002-2005的每个月最后一个星期五10:15 |
0 15 10 ? * 6#3 | 每个月第三周的周五10:15 |
0 0 12 1/5 * ? | 每个月1,6,11..的12:00 |
0 11 11 11 11 ? | 11月11日11点11分 |
4. 使用建议
1) 一般情况下,如果周期性的任务,建议使用PeriodicTrigger来实现,注解方式为fixedRate(String), fixedDelay(String)
2) 无论使用fixed或者cron,强烈建议将表达式或者周期的值配置使用properties文件独立出来。
3) 任务执行时间默认使用系统默认的时区,因此,如果对系统执行环境的时区没有确切的把我,建议在配置的时候明确指定时区。
所有评论(0)