EggJS提供了Schedule,用于执行一些定时任务

EggBornJS在EggJS的Schedule基础上进行了增强,主要体现在两方面:

  1. 可编译
  2. 开发简便

下面我们开发一个Schedule,每隔3秒在控制台打印schedule invoked: Hello World

声明Schedule

src/module/test-party/backend/src/config/config.js

module.exports = appInfo => {
  const config = {};

  // schedules
  config.schedules = {
    scheduleDemo: {
      interval: '3s',
      type: 'worker',
      path: 'test/schedule',
      instance: true,
    },
  };

  return config;
};
名称 说明
scheduleDemo Schedule名称
interval 定时间隔,也支持cron
type all/worker
path 需要执行的后端API路由
instance 系统调用后端API路由时,是否需要向上下文环境注入实例信息

属性instance的本质是什么?

  • 前面我们提到EggBornJS支持多实例。由于Schedule是由系统触发执行的,此时上下文环境是没有实例信息的
  • 如果instance设为false,那么后端API路由就需要自行处理与多实例相关的逻辑
  • 如果instance设为true,那么系统就会自动对多实例进行循环,依次调用后端API路由,并向上下文环境注入实例信息,从而简化后端API路由的开发工作量

声明API路由

src/module/test-party/backend/src/routes.js

{ method: 'post', path: 'test/schedule', controller: test, middlewares: 'inner',
  meta: { auth: { enable: false } },
},
名称 说明
middlewares 指定中间件inner,只允许内部调用
auth.enable 禁止全局中间件auth

为何要禁止全局中间件auth?

  • 因为Schedule是由系统触发执行的,其上下文环境没有用户信息

添加控制器方法

src/module/test-party/backend/src/controller/test.js

async schedule() {
  console.log('schedule invoked: ', 'Hello World');
  this.ctx.success();
}