Spring Cron 表达式

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执行指定的任务。

更具体的总结如下:

位数字段是否必须取值范围允许的特殊字符
10-59, - * /
20-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 * * ? 20052005年每天的上午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-20052002-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. 参考链接
文章知识点与官方知识档案匹配,可进一步学习相关知识
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值