应用场景

EggBornJS底层基于EggJS,我们知道EggJS支持Cluster模式,同时开启多个工作进程为前端提供服务

EggBornJS新增了Broadcast机制,允许向所有工作进程发送一个广播,从而让所有工作进程同时执行某一个任务

下面我们以模块test-party为例,开发一个Broadcast

声明Broadcast

src/suite-vendor/test-party/modules/test-party/backend/src/config/config.js

  1. 1module.exports = appInfo => {
  2. 2 const config = {};
  3. 3
  4. 4 // broadcasts
  5. 5 config.broadcasts = {
  6. 6 broadcastTest: {
  7. 7 bean: 'test',
  8. 8 },
  9. 9 };
  10. 10
  11. 11 return config;
  12. 12};
名称 说明
broadcastTest Broadcast名称
bean Broadcast对应的Bean组件

定义Bean组件

src/suite-vendor/test-party/modules/test-party/backend/src/bean/broadcast.test.js

  1. 1const require3 = require('require3');
  2. 2const assert = require3('assert');
  3. 3
  4. 4module.exports = app => {
  5. 5 class Broadcast extends app.meta.BeanBase {
  6. 6
  7. 7 async execute(context) {
  8. 8 const sameAsCaller = context.sameAsCaller;
  9. 9 const data = context.data;
  10. 10 if (!sameAsCaller) {
  11. 11 // do something
  12. 12 }
  13. 13 // locale
  14. 14 assert.equal(this.ctx.locale, 'zh-cn');
  15. 15 // data
  16. 16 assert.equal(data.message, 'hello');
  17. 17 }
  18. 18
  19. 19 }
  20. 20
  21. 21 return Broadcast;
  22. 22};
名称 说明
context.sameAsCaller 标识当前是否是触发广播的工作进程
context.data 外部传入的参数

注册Bean组件

src/suite-vendor/test-party/modules/test-party/backend/src/beans.js

  1. 1const broadcastTest = require('./bean/broadcast.test.js');
  2. 2
  3. 3module.exports = app => {
  4. 4 const beans = {
  5. 5 // broadcast
  6. 6 'broadcast.test': {
  7. 7 mode: 'app',
  8. 8 bean: broadcastTest,
  9. 9 },
  10. 10 };
  11. 11 return beans;
  12. 12};
注册名称 场景 所属模块 global beanFullName
test broadcast test-party false test-party.broadcast.test

触发Broadcast

src/suite-vendor/test-party/modules/test-party/backend/src/controller/test/feat/broadcast.js

  1. 1async emit() {
  2. 2 this.ctx.app.meta.broadcast.emit({
  3. 3 locale: 'zh-cn',
  4. 4 subdomain: this.ctx.subdomain,
  5. 5 module: 'test-party',
  6. 6 broadcastName: 'broadcastTest',
  7. 7 data: { message: 'hello' },
  8. 8 });
  9. 9 this.ctx.success();
  10. 10}
名称 说明
locale 本地化
subdomain 当前实例对应的子域名,以便执行广播任务时可以正确的回到当前实例的运行环境
module 广播所属模块名称
broadcastName 广播名称
data 向广播传递的参数