最近一个需求是在周一到周五的每天八点到十点每隔五分钟上传一次数据,这就需要用到quartz定时器了,在拼写cron表达式进行定时的时候,总是出错。
拼写的结果为
0 0/5 8-10 ? * 1-5
总结一下,cron表达式其实是一个字符串,字符串以空格分出来几个域,每个与有各标识年月日时分秒,其格式为:
【秒】【分】【小时】【日】【月】【周】【年】
每个域又有自己的取值范围,正如我们的时钟一样每分钟60秒每小时60分每天24小时...这里每个域也有自己的取值范围,也可以使用特殊符号去表示更多含义
域 | 范围 | 特殊字符 | 是否必填 |
---|---|---|---|
秒 | 0-59 | ,-*/ | 是 |
分 | 0-59 | ,-*/ | 是 |
时 | 0-23 | ,-*/ | 是 |
天 | 1-31 | ,-*/? | 是 |
月 | 1-12 | ,-*/ | 是 |
周 | 0-7 | ,-*/? | 是 |
特殊符号含义:
1)"*":匹配该域的任意值,例如在日域上使用"*",则表示每天都触发该定时任务。
2)"?":只能在日和周域使用,表示非明确的值,实际作用等同"*",即匹配任意值。一般在日和周上会出现一次,当然,如果你对日和周两个域都使用"?"或者都使用其他值也没什么问题。
3)"-":表示范围,例如在分域上使用5-10表示从5分钟到10分钟每分钟触发一次。
4)"/":表示起始时间触发一次,然后每隔固定时间触发一次。例如,在分钟域使用"10/2"表示从10分钟开始每隔2分钟触发一次,直 到58分钟。也可以和字符"-"连用,例如在分钟域使用"10-30/2"表示从10分钟开始每隔2分钟触发一次,直到30分钟。
5)",":表示枚举多个值,这些值之间是"或"的关系。例如,在月份上使用"1-3,10,12"表示1月到3月,10月,12月都触发。
实际测试的时候发现我这个cron表达式并不能够实现这个需求,只不过是每天8:00到10:55每5分钟执行一次,所以我认为表示这个范围的特殊字符会包含这个范围后面的一部分,直到该域的下一个时刻之前的时刻。
所以最终我的cron表达式改为了
0 0/5 8-9 ? * 2-6
在周的这个域,也有一个注意的点。就是设置成1的话就是代表周日2代表周一一次类推....但是不知道这个域为什么不会像“时”的那个域一样,时刻延续到周六。在这先做个标记。以后了解到了在进行更新