Global Event
Global Event是bukcy框架提供的一个非常有用的组件。实现了一个逻辑上非常常用的功能:
“在系统中定义一个全局事件,然后在任何一段代码中都可以Attach这个事件,在任何一段代码中都可以Fire这个事件。”
在传统的后台开发中,我们常常使用消息中间件来达到类似功能。从过去的经验来看,我们鼓励应用尽量使用端到端的无状态事件系统(即系统允许丢失事件),当然bucky也允许用户开发自己的有状态事件系统。
Global Event的使用也很简单:
创建并监听事件
let em = getCurrentRuntime().getGlobalEventManager();
let eventCategory = 'myEventCatagory';
let eventID = 'myMessage';
// create an event catagory
em.create(eventCategory, (result) => {
// attach an eventID on the event catagory
console.log(`${eventCategory} is created:${result}`);
em.attach(eventCategory, eventID, (msg) => {
console.log(`${eventCategory}/${eventID} is fired:`, msg);
};
});
触发事件
let em = getCurrentRuntime().getGlobalEventManager();
let eventCategory = 'myEventCatagory';
let eventID = 'myMessage';
// Fire the eventID on the event catagory
let msg = JSON.stringify({
cmd:'echo',
body:{
text:'Real-world programming, however, requires care, expertise, and wisdom.',
from:'SICP'
}
});
em.activeEvent(eventCategory, eventID, msg);
代码说明
从上述代码中我们可以看出来:
- Global Event的操作接口都是异步的。
- Global Event的由event catagory/eventID两层结构构成,方便用户组织事件的名字空间。
- Global Event的参数是一个字符串,我们一般鼓励在里面填写一个stringfiy后的JSON.
- Global Event是应用程序全局的,所以具有分布式系统在一致性方面的特性:attach成功之后存在与事件控制器失去链接的可能,而系统并不会保证在失去连接的这段时间内产生的事件不会丢失。