- 定时上报应用状态,便于系统监控
- 定时从远程接口更新数据
- 定时清理文件
- 清除过期日志文件
https://eggjs.org/zh-cn/basics/schedule.html
schedule定时任务
所有的定时任务,都放在 app/schedule目录下,每个文件都是一个独立的定时任务,
可以配置定时任务的属性和要执行的方法;
系统启动时,执行定时任务
可以在 app.js里面 app.beforeStart 前,await app.runSchedule(‘schedulePath‘) 来注册定时任务
src/app/schedule
'use strict';
const { Subscription } = require('egg');
class getInfo extends Subscription {
static get schedule() {
return {
interval: 2000, // ms
// cron: '',
type: 'worker', // master进程指定一个 worker进程,单独执行定时任务
// all 每个 worker进程都会执行这个定时任务
};
}
async subscribe() {
const { info } = this.ctx;
console.log(Date.now(), info);
}
}
module.exports = getInfo;
app.runSchedule注册任务
通过 app.runSchedule(schedulePath) 来运行一个定时任务;
app.runSchedule 接受一个定时任务文件路径(app/schedule 目录下的相对路径或者完整的绝对路径),执行对应的定时任务,返回一个 Promise。
eggjs 如何手动触发定时任务?
disable值设置为true,然后用 app.runSchedule(schedulePath)来执行,只能执行一次,后续没有定时执行。
disable:false,则启动的时候就开始定时执行了
getInfo,就是 schedule目录下的文件名
/app/schedule/getInfo.js
'use strict';
module.exports = app => {
require('module-alias/register');
// 执行在 Controller之后
app.beforeStart(async () => {
await app.runSchedule('getInfo');
});
// 将 plugin插件放入数组中
app.config.coreMiddleware.push('auth');
// app.beforeClose(async () => {});
};
cron参数
cron-parse参数
https://github.com/harrisiirak/cron-parser#options
https://eggjs.org/zh-cn/basics/schedule.html#%E4%BB%BB%E5%8A%A1
- 秒
- 分钟
- 小时
- 天,一个月内的某一天
- 月,某个月份
- 周,一周内的某一天
// 间隔3秒钟
cron: '*/3 * * * * *'
// 间隔3分钟
cron: '0 */3 * * * *'
// 间隔3个小时
cron: '0 0 */3 * * *'
schedule参数
module.exports = {
schedule: {
interval: '1m', // 1 分钟间隔
type: 'all', // 指定所有的 worker 都需要执行
// 每三小时准点执行一次
cron: '0 0 */3 * * *',
immediate: true,
disable:true,
env: [],
cronOptions: {},
}
}
worker
worker就是一个 node进程
nodejs默认是单进程,单线程,默认只能使用一核CPU
多核CPU,为了充分利用硬件的性能,eggjs使用了 node 集群 cluster来提高性能
- 根据CPU核数,启动多个进程,每个进程就是一个 worker,有 master进程统一管理
- eggjs里面内置了一个 node集群 cluster
- Cluster模块来实现定时任务
type: all
有些定时任务,只需要一个 workder执行
有些任务,需要所有的 worker都执行
- 例如 分割日志,就不能用 all,如果用 all会执行多次