Queue

2018-11-24 03:18:58

EggBorn新增了Queue机制,允许以序列化的方式执行任务

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

声明Queue

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

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

  config.message = 'hello world';

  ...

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

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

声明API路由

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

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

添加控制器方法

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

async queue() {
  const markCount = this.ctx.request.body.markCount;
  const message = this.ctx.config.message;
  const res = `${message}${new Array(markCount + 1).join('!')}`;
  console.log(res);
  this.ctx.success(res);
}

使用Queue

有返回值

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

无返回值

async echo() {
  this.ctx.app.meta.queue.push({
    subdomain: this.ctx.subdomain,
    module: 'test-todo',
    queueName: 'queueDemo',
    data: { markCount: 3 },
  });
  this.ctx.success(null);
}


评论: