七十一、Spring Cron表达式

版权声明:转载请注明:https://blog.csdn.net/u010285974 https://blog.csdn.net/u010285974/article/details/89149077

1. 简介
Spring提供的轻量级调度框架中,任务的调度通过Trigger接口来实现。Trigger接口的一种实现便是基于CRON表达式的。 但是这里的CRON表达式与Linux系列操作系统中crobjob的表达式不一样,需要特别注意。

在使用注解进行调度的时候,一种写法如下:

@Schedule (cron="cron expression")
public void doEtlJob(){
...
}

其中被注解的方法不能有任何返回值(也就是必须为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或者其他起始值


表示最后一个可选值。例如在日期中表示月份的最后一天,30号或31号或28号,根据月份年份不同。星期中表示星期中的最后一天,即7或者SAT。 
在星期中设置为6L,表示月份的最后一个星期五(6表示) 
L-3表示倒数第三天(third-to-last)


只用于日期字段。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) 任务执行时间默认使用系统默认的时区,因此,如果对系统执行环境的时区没有确切的把我,建议在配置的时候明确指定时区。

5. 参考链接
Linux Crobjob中的表达式介绍

Linux Cronjob的表达式翻译工具

基于QuartZ的cronmarker
--------------------- 
作者:Lust-Ring 
来源:CSDN 
原文:https://blog.csdn.net/bingduanlbd/article/details/51740913 
版权声明:本文为博主原创文章,转载请附上博文链接!+

猜你喜欢

转载自blog.csdn.net/u010285974/article/details/89149077
今日推荐