Cron表达式书写教程搞定Linux、Spring、Quartz的定时任务
2023年01月08日 17:46:48 · 本文共 1,363 字阅读时间约 4分钟 · 4,012 次浏览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://blog.renfei.net/posts/1607209030982303815
相关推荐
猜你还喜欢这些内容,不妨试试阅读一下以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。
- 前后端分离项目接口数据加密的秘钥交换逻辑(RSA、AES)
- OmniGraffle 激活/破解 密钥/密匙/Key/License
- CleanMyMac X 破解版 [TNT] 4.6.0
- OmniPlan 激活/破解 密钥/密匙/Key/License
- 人大金仓 KingbaseES V8 R3 安装包、驱动包和 License 下载地址
- Parallels Desktop For Mac 16.0.1.48911 破解版 [TNT]
- Redis 未授权访问漏洞分析 cleanfda 脚本复现漏洞挖矿
- Parallels Desktop For Mac 15.1.4.47270 破解版 [TNT]
- Sound Control 破解版 2.4.2
- 向谷歌搜索引擎主动推送网页的教程 Google Indexing API 接口实现
- 博客完全迁移上阿里云,我所使用的阿里云架构
- 微软确认Windows 10存在bug 部分电脑升级后被冻结
- 大佬们在说的AQS,到底啥是个AQS(AbstractQueuedSynchronizer)同步队列
- 比特币(BTC)钱包客户端区块链数据同步慢,区块链数据离线下载
- Java中说的CAS(compare and swap)是个啥
- 小心免费主题!那些WordPress主题后门,一招拥有管理员权限
- 强烈谴责[wamae.win]恶意反向代理我站并篡改我站网页
- 讨论下Java中的volatile和JMM(Java Memory Model)Java内存模型
- 新版个人网站 NEILREN4J 上线并开源程序源码
- 我站近期遭受到恶意不友好访问攻击公告