定时任务
有时候我们需要在业务中定时(定期)执行一些任务。比如说每天晚上服务器空闲时整理当天的报表。或者每月定期结算员工工资等。
创建项目
参见新建web页面,定时任务需要是2021年1月12日之后创建的项目。并须确保vs扩展mmstudio版本在v4.3.5之后。
创建领域(可选)
新建文件src/schedule/d001/readme.md
。
创建定时任务
使用命令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": "d001/s001",
"description": "工资结算",
"rule": "0 30 9 10 * 1-5",
"start": "",
"end": ""
},
{
"data": {},
"service": "d001/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/d001/s001
,编写代码完成业务逻辑。
部署
需要先编译yarn build
代码,生成js文件(在dist目录)。如果要隐藏原代码,可以在编译完成后将src去掉。
启动定时任务服务命令为yarn start-schedule
。
建议定时任务与web服务部署时分离。