有时候我们需要在业务中定时(定期)执行一些任务。比如说每天晚上服务器空闲时整理当天的报表。或者每月定期结算员工工资等。
使用命令mmstudio: Add schedule
,mmstudio:添加定时任务
或快捷键alt+m s
创建定时任务,按步骤操作。
打开文件mm.json
,修改rule
的策略。默认为
* * * * * *
从左至右第一位表示秒,第二位表示分,第三位表示小时,第四位表示一个月的第几天,取值为1
-31
之间的整数值。第五位表示第几个月份,取值范围为1
-12
,第六位表示一周中的第几天,取值范围为0
-7
,0
和7
都表示周日,1
表示周一,2
表示周二,3
表示周三,4
表示周四,5
表示周五,6
表示周六。
还有几种特殊的表示方式需要说明:
*
表示不设置,即全部。如默认策略就表示没有设定策略,那么这个定时服务就会一直
执行,所谓一直
指服务器一有空闲就会执行。实际业务中一般不会用到这种任务。
m-n
表示从m到n期间都执行,如* * * * * 1-5
表示只工作日执行。
*/n
表示每隔n个时间单位执行一次,如* 30 * * * *
表示每隔半小时执行一次。
m,n
表示m和n都执行,如* * * 10,25 * *
表示每月的10号和25号执行。而* * * * * 1,2,3,4,5
同样可以表示只有工作日才执行。
#m
表示第二个,如* * * * * 0#m
表示每个月的第二个周日
复杂地,比如我们结算工资的策略为:“每月的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 * * *
,同时维护一个节假日的表(或者公共服务),在代码中根据是否为真正的
工作日,然后执行其策略,实现方式会稍简单一些。
可以通过设置start
和end
。
定时任务的开发需要执行命令yarn dev-schedule
。但需注意:
mm.json
中jobs
应有内容。yarn dev-schedule
打开文件src/schedule/s001
,编写代码完成业务逻辑。
需要先编译yarn build
代码,生成js文件(在dist目录)。如果要隐藏原代码,可以在编译完成后将src去掉。
启动定时任务服务命令为yarn start-schedule
。
建议定时任务与web服务部署时分离。