EventBus介绍

什么是EventBus

  • 简单的说,就是一个以事件为驱动的消息服务总线

Web平台运行期为什么要用EventBus

  • 便于业务逻辑解耦
  • 提供丰富的扩展点,包括前扩展、后扩展和覆盖
  • 使用事件驱动,让事件触发更加清晰
  • 让代码更加简洁清楚

Web平台运行期在那些地方使用了EventBus

  • 业务逻辑调度中心,包括前端、Web服务端任何地方
  • 通过EventBus集成各种超类、模板、页面
  • 通过EventBus集成各种系统服务与业务组件

EventBus结构图

cmd-markdown-logo

EventBus注册与触发顺序图

cmd-markdown-logo

什么是Event

  • 一个事件,是注册和触发EventBus的入口
  • Web平台的推荐应用方式为:由运行期框架自动触发,比如页面初始化、页面渲染、异常、页面关闭等

什么是Action

  • 一个动作。是Event的一个子类。比Event增加了一个action名称
  • Web平台的推荐应用方式为:由页面的自有逻辑的代码主动触发。比如保存、新增、复制等

Handler

  • 处理器,消息响应后触发的具体的实现(可为Js、Java或Ranio脚本)

扩展方式

  • 可以在EventBus注入的扩展点,共分为三种:Before/After/Overwrite
  • 如果没有定义,缺省为After

EventBus的两个实现层面-前端EventBus实现

  • [扩展开发平台]-[设置]-[页面事件] cmd-markdown-logo
  • [定义工具]-[设置]-[页面功能] cmd-markdown-logo
  • [定义工具]-[保存],直接生成进行注册的js代码

前端EventBus的API:

_self.getEventBus
	方法:getEventBus:function(){}
	描述:直接返回前端EventBus对象,不推荐直接使用。
_self.subscribeEvent
	方法:subscribeEvent:function(event,fn,pointcut){}
	描述:注册事件,并指定实现方法和插入点
	参数:event:字符串形式事件名,命名规则为Event或ActionEvent结尾
	      fn:实现方法
	      插入点类型:after、overwrite、before
_self.unSubscribeEvent
	方法:unSubscribeEvent:function(event){}
	描述:取消注册事件
	参数:event:字符串形式事件名,命名规则为Event或ActionEvent结尾
_self.fireEvent
	方法:fireEvent:function(event){}
	描述:触发某个具体事件,执行这个事件对于的实现方法队列
	参数:event:字符串形式事件名,命名规则为Event或ActionEvent结尾
	其他参数:可以增加一些后续参数
Handler实现说明:
	参数:接收fireEvent方法传递过来的参数
	特殊参数e:只有按钮绑定的页面功能才有值,手工调用不会有e的。页面功能代码生成时,默认会生成这个e,值为jquery.event
	返回值:无返回值的处理,只能通过返回值确定是否继续执行后续的方法队列
	        true/无:继续执行后续的实现方法队列
	        false:停止执行后续的实现方法队列    
	        其他:返回true
	Handle队列中数据的传递:只能利用页面的全局变量,本身没有提供处理机制

EventBus的两个实现层面-服务端端EventBus实现

  • [定义工具]-[设置]-[后台功能] cmd-markdown-logo
  • [定义工具]-[保存],在页面元数据中生成对应配置文件uic配置文件片段,并保存于页面元数据中

服务端EventBus的API:

Event:com.kingdee.bos.eventbus.KDEvent
	private boolean needReturn = true;
	描述:是否返回结果
	private Object successResult = null;
	描述:成功执行的正确的JSon结果
	private Object jsonResult = null;
	描述:返回的JSon结果
	public final RequestContext getReqeustContext() {
	描述:获得服务的申请参数,包括事件名、httpRequest、额外的参数列表
	public final RequestContext getReqeustContext() {
	描述:获得响应的申请参数,包括httpRespose、额外的参数列表、重定向路径
	public void kill() {}
	描述:直接阻止后续实现器的执行
Action:com.kingdee.bos.eventbus.event.action.KDActionEvent
	String actionName;
	描述:action的名称
Handle队列中数据的传递:
	在Handler实现器中,传递Event对象,因此可以通过定义对象类增加属性的方式,实现在各个handler中传值
	通过event.getReqeustContext()对象,实现在各个handler中传值
返回值:优先级为标注的的成功信息属性>事件对象的成功结果变量>事件对象的返回结果
	优先级为标注的的成功信息属性:这种注解方式不推荐实现
	事件对象的成功结果变量:successResult
	事件对象的返回结果: jsonResult 
响应Action的Handler:
	继承com.kingdee.bos.webframework.dynamic.handler.AbstractWebEventHandler
	实现com.kingdee.bos.eventbus.event.action.IActionEventHandler
响应Event的Handler:
	继承com.kingdee.bos.webframework.dynamic.handler.AbstractWebEventHandler
com.kingdee.bos.eventbus.support.SimpleEventBus
	描述:是EventBus中最主要的一个实现类
	public void fireEvent(KDEvent event) {}
	描述:触发一个事件
	private void doFire(KDEvent event, Object source) {}
	描述:找到event所对应的全部handler,按扩展类型,排序执行
com.kingdee.bos.eventbus.definition.UIConfig
	描述:UIC解析的主要类
	public Map<String, Collection<Plugin>> getRegisterPlugins(HandlerType handlerType) {}
	描述:取已经注册插件的集合,是获得handler的入口
	private void collectPlugins(Map<HandlerType, Map<String, Collection<Plugin>>> pluginMap, Set<String> overwrited) {}
	描述:按递归的方式,逐层获得uic中对应的plugin及handler
com.kingdee.bos.webframework.dynamic.application.WebApplication
	描述:每个Web页面的应用对象。
	public IEventBus getEventBus() {}
	描述:获得EventBus对象(SimpleEventBus),不推荐直接这么使用
	public IKDEventFireFirer getEventFirer() {}
	描述:获得EventBus触发器(WebEventFirer),直接发起后台服务请求时使用
	public UIConfig getUIConfig {}
	描述:获得UIC配置对象(UIConfig)
	public IModelService getModelService() {}
	描述:获得数据模型服务(WebDefaultModelService)
com.kingdee.bos.webframework.dynamic.event.register.WebEventFirer
	描述: Web页面的EventBus触发器
	public KDEvent fireWebActionEvent(HttpServletRequest request,HttpServletResponse response, odelMap modelMap,String actionName) {}
	描述:触发一个Action事件
	public void fireWebEvent(HttpServletRequest request,HttpServletResponse response, ModelMap modelMap,KDEvent event) {}
	描述:触发一个事件