测试过程中经常用到调度系统,往往某个调度任务我需要问开发它是如何执行的。比如:凌晨1:30执行、每天的每小时30分执行、10分钟执行一次等等。这个执行规则的配置来源于cron表达式,学会了我们自己就能直接查看。
解析:
一、cron表达式规则:
cron表达式,以空格作为分隔符,分为6个参数或者7个参数,每个参数代表不同的单位。
从左到右分别代表:秒、分钟、小时、日、月、星期几、年。
但是年参数,不是必须的,可以省略。可以看到上面截图中的cron表达式均为6个参数,因为没有年的参数。下面也以6个参数进行学习。
二、cron表达式各个参数的取值:
秒范围:(0-59)
分钟范围:(0-59)
小时范围:(0-23)
日范围:(1-31)
月范围:(1-12 或 JAN-DEC)
星期几范围:(0-6 或 SUN-SAT)
年范围:(可选,1970-2099)
以下面公式为例:0 0 21 * * ?
先看有值的部分,秒位是0,分钟位也是0,小时位是21点(后面参数看不懂,一会讲)
拼起来理解这个调度任务是:每天的21:00:00执行1次;
三、cron表达式的常用特殊字符
* :代表所有,位于秒位,就是所有秒;位于小时位,就是所有小时都执行;
/ :代表步长(频率),例如:分钟为 0/20(也可以写为*/20),就是每20分钟执行1次。如果位于秒位,就是每20秒执行1次;
- :代表范围,例如:分钟位为:0-3,代表0至3分钟的每1分钟。(0分,1分,2分,3分)
, :代表指定多个值,例如:0,1,2,3 与 0-3 代表意义一样,只是写法不同
? :(无意义占位符):用于指定一个字段没有具体的取值,只能与其他字段一起使用。
注意:日和星期不限制范围的话,不能同时用星号指定,只能1个是星,一个是问号。哪个是星,哪个是问号无所谓。所以这也是上面截图中为什么同一个cron表达式,有星有问号的缘故。
四、举例解析:
6 3 21 * * ? :秒数是6,分钟数是3,小时数是21;日和月和星期未指定,合起来就是 每天的21:03:06执行1次;
0 0 2 27 9 ? :秒数是0,分钟数是0,小时数是2,日期是27号,月份是9月;合起来就是每年的9月27日 凌晨2:00执行该任务;
*/20 * * * * ?:秒数是每20秒执行1次;
0 0/10 0-6 * * ? :秒是0秒,分钟是每10分钟执行1次;小时是0至6小时;日和月和星期未指定。合起来就是:每天的0到6点,每10分钟整执行1次;
0 0 3-5 * * ? :秒数是0,分钟数是0,小时是3--5小时;日和月和星期未指定。合起来就是:每天的3:00至5:00,每小时执行1次;或者说每天凌晨3:00,4:00 ,5:00点,每小时执行一次任务,共3次;
0 0 3,4,5 * * ? :与上面0 0 3-5 * * ?表达式一致,仅写法不同;
* 0 3 * * ?":秒数是*,代表所有秒,分钟数是0,小时是3;日和月和星期未指定。合起来就是:每天的凌晨3:00:00时候开始,每秒都执行1次,一共执行60次,当进入3:01:00时候会停止执行;
五、cron表达式在线小工具