定时任务

有时候我们需要在业务中定时(定期)执行一些任务。比如说每天晚上服务器空闲时整理当天的报表。或者每月定期结算员工工资等。

创建定时任务

使用命令mmstudio: Add schedulemmstudio:添加定时任务或快捷键alt+m s创建定时任务,按步骤操作。

修改定时策略

打开文件mm.json,修改rule的策略。默认为

* * * * * *

从左至右第一位表示秒,第二位表示分,第三位表示小时,第四位表示一个月的第几天,取值为1-31之间的整数值。第五位表示第几个月份,取值范围为1-12,第六位表示一周中的第几天,取值范围为0-707都表示周日,1表示周一,2表示周二,3表示周三,4表示周四,5表示周五,6表示周六。

还有几种特殊的表示方式需要说明:

复杂地,比如我们结算工资的策略为:“每月的10号9点半执行,但如果10号为周末,则延迟到下个周一执行”,我们可以制定两个定时任务来完成。

{
    "jobs": [
        {
            "data": {},
            "service": "s001",
            "description": "工资结算",
            "rule": "0 30 9 10 * 1-5",
            "start": "",
            "end": ""
        },
        {
            "data": {},
            "service": "s001",
            "description": "工资结算",
            "rule": "0 30 9 11,12 * 1",
            "start": "",
            "end": ""
        }
    ]
}

两个定时任务同时对应的服务为同一个js文件,第一个规则为

0 30 9 10 * 1-5

它表示如果每个月10号如果是工作日(1-5)则执行。但会遇到10号为周六和10号为周日的情况,我们使用第二个规则来弥补:

0 30 9 11,12 * 1

即每个月11号或12号为周一的情况,很明显,如果11号为周一,那么10号就是周日。同样的,如果12号为周一,那么10号那天是周六。

诸如此类,一些复杂一些的规则可以通过各种组合来完成。

有些人可能会抬杠:这样不能跳过法定的其它节假日呀!没错,如果要使用真正的节假日,我们是不能(或者说理论上虽然可以,但会因规则会过于复杂实际上不可行)通过简单这样的规则设定来完成的。如果真有这样的需求,我建议设定每天都执行的定时任务0 30 9 * * *,同时维护一个节假日的表(或者公共服务),在代码中根据是否为真正的工作日,然后执行其策略,实现方式会稍简单一些。

设置起止时间

可以通过设置startend

开发

定时任务的开发需要执行命令yarn dev-schedule。但需注意:

  1. 配置文件mm.jsonjobs应有内容。
  2. 配置文件如果有修改,需要再次执行命令yarn dev-schedule

修改定时任务逻辑

打开文件src/schedule/s001,编写代码完成业务逻辑。

部署

需要先编译yarn build代码,生成js文件(在dist目录)。如果要隐藏原代码,可以在编译完成后将src去掉。

启动定时任务服务命令为yarn start-schedule

建议定时任务与web服务部署时分离。