应用场景
EggBornJS底层基于EggJS,我们知道EggJS支持Cluster模式,同时开启多个工作进程为前端提供服务
EggBornJS新增了Broadcast
机制,允许向所有工作进程发送一个广播,从而让所有工作进程同时执行某一个任务
下面我们以模块test-party
为例,开发一个Broadcast
声明Broadcast
src/suite-vendor/test-party/modules/test-party/backend/src/config/config.js
- 1module.exports = appInfo => {
- 2 const config = {};
- 3
- 4 // broadcasts
- 5 config.broadcasts = {
- 6 broadcastTest: {
- 7 bean: 'test',
- 8 },
- 9 };
- 10
- 11 return config;
- 12};
名称 | 说明 |
---|---|
broadcastTest | Broadcast名称 |
bean | Broadcast对应的Bean组件 |
定义Bean组件
src/suite-vendor/test-party/modules/test-party/backend/src/bean/broadcast.test.js
- 1const require3 = require('require3');
- 2const assert = require3('assert');
- 3
- 4module.exports = app => {
- 5 class Broadcast extends app.meta.BeanBase {
- 6
- 7 async execute(context) {
- 8 const sameAsCaller = context.sameAsCaller;
- 9 const data = context.data;
- 10 if (!sameAsCaller) {
- 11 // do something
- 12 }
- 13 // locale
- 14 assert.equal(this.ctx.locale, 'zh-cn');
- 15 // data
- 16 assert.equal(data.message, 'hello');
- 17 }
- 18
- 19 }
- 20
- 21 return Broadcast;
- 22};
名称 | 说明 |
---|---|
context.sameAsCaller | 标识当前是否是触发广播的工作进程 |
context.data | 外部传入的参数 |
注册Bean组件
src/suite-vendor/test-party/modules/test-party/backend/src/beans.js
- 1const broadcastTest = require('./bean/broadcast.test.js');
- 2
- 3module.exports = app => {
- 4 const beans = {
- 5 // broadcast
- 6 'broadcast.test': {
- 7 mode: 'app',
- 8 bean: broadcastTest,
- 9 },
- 10 };
- 11 return beans;
- 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
- 1async emit() {
- 2 this.ctx.app.meta.broadcast.emit({
- 3 locale: 'zh-cn',
- 4 subdomain: this.ctx.subdomain,
- 5 module: 'test-party',
- 6 broadcastName: 'broadcastTest',
- 7 data: { message: 'hello' },
- 8 });
- 9 this.ctx.success();
- 10}
名称 | 说明 |
---|---|
locale | 本地化 |
subdomain | 当前实例 对应的子域名 ,以便执行广播任务时可以正确的回到当前实例 的运行环境 |
module | 广播所属模块名称 |
broadcastName | 广播名称 |
data | 向广播传递的参数 |
评论: