EggBornJS新增了Queue机制,允许以队列的方式执行任务

下面我们开发一个Queue,以队列的方式实现一个简单的逻辑

声明Queue

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

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

  // queues
  config.queues = {
    queueTest: {
      path: 'test/feat/queue',
    },
  };

  return config;
};
名称 说明
queueTest Queue名称
path 需要执行的后端API路由

声明API路由

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

{ method: 'post', path: 'test/queue', controller: test, middlewares: 'inner' }
名称 说明
middlewares 指定中间件inner,只允许内部调用

添加控制器方法

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

async queue() {
  const message = this.ctx.config.message;
  this.ctx.success(message);
}

使用Queue

有返回值

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

async pushAsync() {
  const res = await this.ctx.app.meta.queue.pushAsync({
    subdomain: this.ctx.subdomain,
    module: 'test-party',
    queueName: 'queueTest',
    data: { a: 1, b: 2 },
  });
  assert.equal(res, 3);
  this.ctx.success();
}
名称 说明
queue.pushAsync 有返回值的调用方式
subdomain 当前实例对应的子域名,以便执行队列任务时可以正确的回到当前实例的运行环境
module 队列所属模块名称
queueName 队列名称
data 向队列任务传递的参数

无返回值

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

async push() {
  this.ctx.app.meta.queue.push({
    subdomain: this.ctx.subdomain,
    module: 'test-party',
    queueName: 'queueTest',
    data: { a: 1, b: 2 },
  });
  this.ctx.success();
}