Keeper 中的 Cron 表达式

概述

Cron 表达式是用于任务调度中表示时间计划的行业标准,几乎能够满足所有与时间有关的调度设置需求。如每天的凌晨1点执行或每小时执行一次等,都可以用 Cron 表达式来表示。Keeper 对标准的 Cron 表达式进行了一些扩展,以满足更多应用场景的需要。

标准的的 Cron 表达式一共7位,从左到右分别是:秒 分钟 小时 天 月 星期 年,每个时间位之间使用半角空格隔开。几个例子:

每个时间位的取值、支持的符号和关键词如下:

特别注意,在 Keeper 中,秒位始终为0。有的应用场景中,Cron 表达式的位数不是7位,如crontab中会省略。Keeper 中支持17位的 Cron 表达式,见下面的说明。

特殊符号

在上面已经见到了好几个特殊符号,现将每个符号代表的意义说明如下:

特别的,有些情况下设置等价,例如:

关键字

名称关键字和名称关键字只支持3位的英文单词缩写,下面主要对其他的关键字进行介绍。

特别的,关键字不区分大小写。上面的FL关键字还可以和其他的值组合,见天设置和星期设置。

天设置

在 Cron 表达式中的天设置相对复杂一些,有一些特殊的情况,比如每月的天数不固定、有工作日和节假日的区分等。分别举例说明如下:

星期设置

在 Cron 表达式设置中,星期的设置应该是最复杂的。分别举例说明如下:

用数字还是英文单词缩写表示星期依照个人习惯即可。

月设置

在日常使用中,月份一般为*号。特殊情况下可以使用关键词或数字进行设置。

特殊工作日和休息日设置

每年都有一些法定节假日,也有一些公司的放假安排与法定节假日不同,比如春节法定节假日为7天,有的公司可以放15天。由于以上两种情况,所以在工作日W和节假日R设置时,不能完全按照周一到周五为工作日、周六和周日为休息日的来进行任务调度。

系统管理员或调度管理员可以在 Master 管理平台的“系统设置”->“Keeper 监控”->“工作日历”中进行设置。Keeper 会按照这个设置进行特殊工作日和特殊休息日的区分,如果没有设置,则仍然默认周一到周五为工作日、周六和周日为休息日。

简化格式

上面提到 Keeper 支持17位的 Cron 表达式格式设置,是由于有的时间位字段值不会变,如秒位始终为0,年位和月位一般都为*等。下面分别说明一下不同位数格式都简化了什么:

易读格式

除了标准的 Cron 表达式格式外,Keeper 还支持另外两种易读的表达式格式。

第一种格式和地址查询字符中类型,如HOUR=2&MINUTE=0表示每天凌晨2点执行,等价于0 2。支持的参数名如下:

使用=号对某一位进行设置,不同位设置之间使用&号隔开。在这种格式中,仅需要设置需要的时间位,其他不需要设置的位可以省略。这种格式忽略设置的顺序,也可以规避错位的问题。

另一种格式更加易读,主要提供给非技术人员使用,如DAILY 12:00表示每天中午12点执行。常见的格式如下:

这种格式支持非常多的关键词,这些关键词主要集中在WEEKLYMONTHLYYEARLY三种模式中,简单列表如下:

同样的,以上关键字不区分大小写。

设置多个表达式

业务需求是复杂多变的,Cron 表达式虽然强大,但仍然不能完全涵养所有的需求。如业务要求任务在09:3010:45各执行一次,这时一个表达式根本不能解决问题。Keeper 给出的解决方案是设置两个表达式,如30 9; 45 10DAILY 09:30; 10:45。同样的,可以设置两个以上的表达式,多个表达式之间使用分号;隔开即可,分号两端有没有空格都没关系。

无限循环任务

Keeper 中支持无限循环任务,主要为数据准实时计算或数据大屏准备,比如每2秒钟更新一次数据。但是这种实时更新是相对的,比如在工作时间早9点到晚7点有人看大屏的时候可以计算频繁一点,晚上非工作时间没人看的时候计算间隔设置长一些,以释放服务器的计算资源,供其他任务使用,特别是在晚上0点到凌晨的计算高峰期。

Keeper 的解决方案是可以分段设置无限循环任务的时间间隔,如60; 2@* 9-18; 8@* 19-23表示在9点到18点之间每隔2秒执行一次,在19点到23点之间每隔8秒执行一次,其他时间每隔60秒执行一次。也可以不设置默认值,即在非指定的时间段不执行任务,如2@* 9-18; 8@* 19-23,即在0点到8点之间不执行任务。

更多信息

PQL 的依赖包中,提供了几个类用于 Cron 表达式的解析,包路径为io.qross.time

以上几个类属于 DataHub 框架的一部分。在 PQL 中,同样提供了对应的 Sharp 表达式用于 Cron 表达式操作,详细点击这里


参考链接


微信公众号
码农老吴  |  星源工作室  |  开发月志  |  问题反馈
联系我们:wu@qross.io     手机/微信:18618171102
京 ICP 备 20027445 号
$(h1)!