cron是什么
cron的意思就是:计划任务,说白了就是定时任务。我和系统约个时间,你在几点几分几秒或者每隔几分钟跑一个任务(job),就那么简单。
cron表达式
cron表达式是一个好东西,这个东西不仅Java的quartZ能用到,Go语言中也可以用到。我没有用过Linux的cron,但网上说Linux也是可以用crontab -e 命令来配置定时任务。Go语言和Java中都是可以精确到秒的,但是Linux中不行。
cron表达式代表一个时间的集合,使用6个空格分隔的字段表示:
|
字段名 |
是否必须 |
允许的值 |
允许的特定字符 |
|
秒(Seconds) |
是 |
0-59 |
* / , - |
|
分(Minute) |
是 |
0-59 |
* / , - |
|
时(Hours) |
是 |
0-23 |
* / , - |
|
日(Day of month) |
是 |
1-31 |
* / , - ? |
|
月(Month) |
是 |
1-12 或 JAN-DEC |
* / , - |
|
星期(Day of week) |
否 |
0-6 或 SUM-SAT |
* / , - ? |
1.月(Month)和星期(Day of week)字段的值不区分大小写,如:SUN、Sun 和 sun 是一样的。
2.星期(Day of week)字段如果没提供,相当于是 *
cron特定字符说明
1)星号(*)
表示 cron 表达式能匹配该字段的所有值。如在第5个字段使用星号(month),表示每个月
2)斜线(/)
表示增长间隔,如第1个字段(minutes) 值是 3-59/15,表示每小时的第3分钟开始执行一次,之后每隔 15 分钟执行一次(即 3、18、33、48 这些时间点执行),这里也可以表示为:3/15
3)逗号(,)
用于枚举值,如第6个字段值是 MON,WED,FRI,表示 星期一、三、五 执行
4)连字号(-)
表示一个范围,如第3个字段的值为 9-17 表示 9am 到 5pm 直接每个小时(包括9和17)
5)问号(?)
只用于 日(Day of month) 和 星期(Day of week),表示不指定值,可以用于代替 *
6)L,W,#
Go中没有L,W,#的用法,下文作解释。
cron举例说明
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
下载安装
go get github.com/robfig/cron $GOPATH
源码解析
文件目录讲解
cron.go
结构体:
关键方法:
spec.go
结构体及关键方法:
看了上面的东西肯定有人疑惑为什么秒分时这些都是定义了unit64,以及定义了一个常量starBit = 1 << 63这种写法,这是逻辑运算符。表示二进制1向左移动63位。原因如下:
cron表达式是用来表示一系列时间的,而时间是无法逃脱自己的区间的 , 分,秒 0 - 59 , 时 0 - 23 , 天/月 0 - 31 , 天/周 0 - 6 , 月0 - 11 。 这些本质上都是一个点集合,或者说是一个整数区间。 那么对于任意的整数区间 , 可以描述cron的如下部分规则。
-
* | ? 任意 , 对应区间上的所有点。 ( 额外注意 日/周 , 日 / 月 的相互干扰。)
-
纯数字 , 对应一个具体的点。
-
/ 分割的两个数字 a , b, 区间上符合 a + n * b 的所有点 ( n >= 0 )。
-
- 分割的两个数字, 对应这两个数字决定的区间内的所有点。
-
L | W 需要对于特定的时间特殊判断, 无法通用的对应到区间上的点。
至此, robfig/cron为什么不支持 L | W的原因已经明了了。去除这两条规则后, 其余的规则其实完全可以使用点的穷举来通用表示。 考虑到最大的区间也不过是60个点,那么使用一个uint64的整数的每一位来表示一个点便很合适了。所以定义unit64不为过
下面是go中cron表达式的方法:
parser.go
将字符串解析为SpecSchedule的类。
项目中应用
注: @every 用法比较特殊,这是Go里面比较特色的用法。同样的还有 @yearly @annually @monthly @weekly @daily @midnight @hourly 这里面就不一一赘述了。希望大家能够自己探索。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://www.cnblogs.com/zuxingyu/p/6023919.html