1. 定时上报应用状态,便于系统监控
  2. 定时从远程接口更新数据
  3. 定时清理文件
    1. 清除过期日志文件

https://eggjs.org/zh-cn/basics/schedule.html

schedule定时任务

所有的定时任务,都放在 app/schedule目录下,每个文件都是一个独立的定时任务,
可以配置定时任务的属性和要执行的方法;

系统启动时,执行定时任务
可以在 app.js里面 app.beforeStart 前,await app.runSchedule(‘schedulePath‘) 来注册定时任务

src/app/schedule

  1. 'use strict';
  2. const { Subscription } = require('egg');
  3. class getInfo extends Subscription {
  4. static get schedule() {
  5. return {
  6. interval: 2000, // ms
  7. // cron: '',
  8. type: 'worker', // master进程指定一个 worker进程,单独执行定时任务
  9. // all 每个 worker进程都会执行这个定时任务
  10. };
  11. }
  12. async subscribe() {
  13. const { info } = this.ctx;
  14. console.log(Date.now(), info);
  15. }
  16. }
  17. 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

  1. 'use strict';
  2. module.exports = app => {
  3. require('module-alias/register');
  4. // 执行在 Controller之后
  5. app.beforeStart(async () => {
  6. await app.runSchedule('getInfo');
  7. });
  8. // 将 plugin插件放入数组中
  9. app.config.coreMiddleware.push('auth');
  10. // app.beforeClose(async () => {});
  11. };

cron参数

cron-parse参数
https://github.com/harrisiirak/cron-parser#options
https://eggjs.org/zh-cn/basics/schedule.html#%E4%BB%BB%E5%8A%A1

  1. 分钟
  2. 小时
  3. 天,一个月内的某一天
  4. 月,某个月份
  5. 周,一周内的某一天

image.png

  1. // 间隔3秒钟
  2. cron: '*/3 * * * * *'
  3. // 间隔3分钟
  4. cron: '0 */3 * * * *'
  5. // 间隔3个小时
  6. cron: '0 0 */3 * * *'

schedule参数

  1. module.exports = {
  2. schedule: {
  3. interval: '1m', // 1 分钟间隔
  4. type: 'all', // 指定所有的 worker 都需要执行
  5. // 每三小时准点执行一次
  6. cron: '0 0 */3 * * *',
  7. immediate: true,
  8. disable:true,
  9. env: [],
  10. cronOptions: {},
  11. }
  12. }

image.png

worker

worker就是一个 node进程
nodejs默认是单进程,单线程,默认只能使用一核CPU
多核CPU,为了充分利用硬件的性能,eggjs使用了 node 集群 cluster来提高性能

  • 根据CPU核数,启动多个进程,每个进程就是一个 worker,有 master进程统一管理
  • eggjs里面内置了一个 node集群 cluster
  • Cluster模块来实现定时任务

image.png

type: all

有些定时任务,只需要一个 workder执行
有些任务,需要所有的 worker都执行

  • 例如 分割日志,就不能用 all,如果用 all会执行多次