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 版权协议,转载请附上原文出处链接及本声明。
相关推荐
猜你还喜欢这些内容,不妨试试阅读一下评论与留言
以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。微信订阅号
扫码关注「任霏博客」微信订阅号- 你写得非常清晰明了,让我很容易理解你的观点。
- 感谢分享!拿走了~
- 您是说 UCClient 类接收来自Discuz的UCenter的消息吧,请求是来自 Discuz 的 UCenter吗?code 为 null 说明请求URL地址中没有 code 参数 (?code=xxx) ,确定是 UCenter 发起的请求吗?
- String code = request.getParameter("code"); code一直是null 这是为什么啊
- 你好,我想问一下如果是分析型的数据库要怎么制作docker镜像呢 是修改V008R003C002B0320版本号吗
- 可以的,我也正在开发分享的程序,可以邮件或群联系我都可以,关于页面里有联系方式:https://www.renfei.net/page/about 。
- 有破解软件的需要可以私下联系您吗?
- 您好,手机APP只是个客户端,用于数据呈现展示,数据均保存在服务器上,只留个APP没有任何用处,无能为力哦。
- 老哥 看你弄了这么多软件好厉害啊。 我有个软件 我买过几个小会员 没用几天 然后商家跑路了,软件服务器关闭了,连不上去 用不了。 你能做成一个打补丁版本可以本地用的么? 方便看下么?https://haodezhe.lanzouw.com/iD0f30h9joza 谢谢老哥!
- 您好,由于版权投诉和我国知识产权法的完善,我已经下架所有破解软件的下载链接了。
- 生花妙笔信手来 – 基于 Amazon SageMaker 使用 Grounded-SAM 加速电商广告素材生成 [1]
- github.renfei.net 不再完整代理 Github 页面改为代理指定文件
- 优雅的源代码管理(三):本地优雅的使用 Git Rebase 变基
- 优雅的源代码管理(二):Git 的工作原理
- 优雅的源代码管理(一):版本控制系统 VCS(Version Control System)与软件配置管理 SCM(Software Configuration Management)
- ChatGPT 开发商 OpenAI 买下极品域名 AI.com
- 火爆的 AI 人工智能 ChatGPT 国内注册教程、使用方式和收费标准
- 解决 SpringCloud 中 bootstrap.yml 不识别 @activatedProperties@ 参数
- Cron表达式书写教程搞定Linux、Spring、Quartz的定时任务
- 阿里云香港可用区C发生史诗级故障