最近作一个活动,须要用到定时任务,因而使用了 node-schedule 库。node
用法很简单,就是可配置开始、结束时间,以及重复执行的时间点,以下所示,从2020-12-23T09:00:00Z开始,每10分钟执行一次,直至2020-12-23T09:30:30Z结束。git
schedule.scheduleJob({ start: '2020-12-23T09:00:00Z', end: '2020-12-23T09:30:30Z', rule: '* */10 * * * *' }, test);
若是是须要在将来某个时间段执行的定时任务,那么要还原真实场景,就得修改服务器时间。github
测试环境虽然能够改时间,可是咱们这边是几个组共用几台服务器,修改了时间后,可能会影响其余组的业务,而且正式环境的时间是不能修改的。数据库
一开始测试的时候,改过几回时间,改时间毕竟太繁琐,每次代码发布,服务器的时间就又会重置,又要修正一次,还收到了其余组的投诉。服务器
后面就改为今天的时间段,此次的定时任务的时间段有7个,每次修改好后,就要提交一遍代码,而后合并分支,最后发布一下代码,服务也会从新启动。post
这种纯手工方式过于费时,后面想到能够在后台作个通用配置(下图是个配置列表),将这些常量(例如时间参数)存在数据库(例如MongoDB或MySQL)中,可随时读写。测试
下图是个增和改的弹框,在新增的时候须要格式化多行文本中的JSON数据,先用 eval(),再用JSON.stringify(),这样的话在调用JSON.parse()的时候就不会出错。阿里云
JSON.stringify(eval(`(${values.content})`))
为了让JSON数据的展现更友好,就须要格式化数据,也就是要有空格。spa
JSON.stringify(JSON.parse(record.content), null, 2)
在测试环境或正式环境,若是定时任务处理的数据错误了,那么只能经过日志来排查。调试
而一台跑着的服务器中会有不少其余的定时任务,在测试环境中,为了能看清楚日志,能够只运行一个任务。
可是在正式环境中,是不能中止任务的,像目前运行的定时任务,可能几秒内就有几百行的日志,用肉眼观察有点累。
好在咱们这边接入了阿里云的日志服务,能够查看日志控制台,里面有丰富的查询过滤条件,能够准确的定位到某条日志。
若是你有更好的调试方法,欢迎留言讨论。
在线上运行的时候,可能会由于这个那个的问题致使任务没有在指定时间运行。
那么就得开放一个入口,来手动执行这个任务。
一开始的想法是写个临时接口,而后用postman手动访问,不过这样的话对运营不太友好,毕竟运营会有人半夜值班盯着活动,但开发人员是不会半夜还盯着服务器的。
因而又快速搭了个后台执行页面,有个下拉框可选择任务时间段,还有个运行按钮,到时候出问题的话,就手动运行一次。