轻松的午后,就像你的微笑,温暖而愉快。

编程开发

Cron表达式书写教程搞定Linux、Spring、Quartz的定时任务

2023年01月08日 17:46:48 · 本文共 1,363 字阅读时间约 4分钟 · 1,160 次浏览
Cron表达式书写教程搞定Linux、Spring、Quartz的定时任务

Cron表达式是什么我想能看到这篇博文的同学已经知道是用来干什么的了,一般我们在Linux、Spring、Quartz中进行定时任务设置的时候需要写Cron表达式来设置任务执行的周期。cron的读音是英 ['krɔ:n]/美 ['krɒn],类似中文克龙的读音。

Cron 类型

Cron表达式是一个字符串,包含五个到七个由空格分隔的字段,Linux、Spring、Quartz 并不同,后面我们分开讨论,先在这里介绍比较通用的全部情况,如果你测试自己写的对不对,我也提供了:Cron在线测试工具

用空格分隔的每个域可能使用数字、,、-、*、/、?、L、W、#这些代号来表示不同的含义,具体含义如下:

  • 数字:具体的时间点
  • ,:表示列出枚举值值,其实就是或的意思,例如 1,3 就是 1或3 的时候
  • -:表示范围,例如 1-3 就是 1到3 的意思
  • *:表示匹配该域的任意值,意思就是随便一个数
  • /:表示数值的增量,其实就是间隔,例如在分域写上 0/5 表示从0分开始,每隔5分钟
  • ?:只能用在 Day of Month 和 Day of Week两个域,也是任意值的意思,例如想在每月的20日触发,不管20日是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用*,如果使用*表示不管星期几都会触发
  • L:表示最后,只能出现在 Day of Week 和 Day of Month 域,如果在 Day of Week 域使用5L,意味着在最后的一个星期四触发
  • W:表示有效工作日(周一到周五),只能出现在 Day of Month 域,例如:使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发,如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发
  • #:用于确定每个月第几个星期几,只能出现在 Day of Week 域。例如在4#2,表示某月的第二个星期三

上面提到了各种域,因为每个系统并不一样,所以下面分开介绍。

Linux(crontab)

在 Linux 中是 5 个域,分别是:Minutes、Hours、Day of Month、Month、Day of Week,五个域,意思是分别是:分钟、小时、天、月、周。

根据上面的表示方法,我们尝试造一个:18点到23点,每到0分和30分时执行的任务表达式,就是 0,30 18-23 * * *,解析就是:0,30代表分钟为0或者30,18-23代表小时18至23,其他星号代表任意匹配。

Java(Spring)

在 Spring 框架中,也为我们提供了 @Scheduled 的定时任务能力,它有 6 个域,分别是:Second、Minutes、Hours、Day of Month、Month、Day of Week,六个域,意思是分别是:秒、分钟、小时、天、月、周。

跟上面的 Linux 一样,只不过增加了秒的字段,精确到了秒,根据上面的表示方法,我们尝试造一个:每个月28日至31日18点整执行的任务表达式,就是 0 0 18 28-31 * ?,解析就是:第一个 0 代表 0秒,第二个 0  代表 0分,18 代表18点,28-31 代表每个月28到31日,星号代表任意月份,问号代表任意周几。

Quartz 任务调度框架

在 Quartz 任务调度框架中,Cron表达式在 Spring 的基础上再增加一个字段,它有 7 个域,分别是:Second、Minutes、Hours、Day of Month、Month、Day of Week、Year[optional],六个域,意思是分别是:秒、分钟、小时、天、月、周、年(可选)。

Quartz 是比较专业的任务调度框架增加了一个年份的域,但这是可选的,可以不写,也就是说你用前 6 个域也是没问题的,我们一般忽略最后的年份域不写,但如果要在具体年份触发,也可以使用。

我们再练习一个:在每个月最后一天18点整触发,这个比较常用吧,月底最后一天,就是 0 0 18 L * ?,解析是第一个 0 代表 0秒,第二个 0  代表 0分,18 代表18点,L在 Day of Month 域上就是最后一天,星号代表任意月份,问号代表任意周几。

总结

只要理解各个域是什么,是不是很简单,我感觉比正则表达式好学多了,赶快去:Cron在线测试工具 里面练习探索一下吧。

商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://www.renfei.net/posts/1607209030982303815
评论与留言

以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。

微信搜一搜:任霏博客