关于事件总线的进一步思考
闲话    web java    2016-04-29 22:23:03    545    0    0
  web java

最近比较空,做全栈工程师论坛的时候之前构思的事件库正好得用,而且有个同事也对这个库感兴趣,所以打算抽点时间把这个库做出来。同时在做的过程中更加理清了思路。

需要实现的功能

  1. 注册一个事件的 before, on ,after 事件。这是最基本的功能。 before, on ,after必须要在上一个阶段执行完了之后自动执行。实际上 after 之后会有一个隐含的 next 阶段来实现与下一个事件的对接。额外的 error事件作为执行异常的响应。
  2. 一个响应同时关联多个事件。此处的多个事件的响应指的是对于其中每个事件都响应。而之前设想的多个事件都发生了才响应的,不打算做了,这个应该是用户来实现的。用户可以通过监听多个事件,每次都响应并记录状态,达到想要的触发条件,可以是每个事件都触发过一遍,也可以是都触发过两遍,自己去触发下一个事件。
  3. js 的实现中要分同步响应和异步响应,同步响应调用过之后就算完了,异步响应需要回调 done 方法才算完。java 中需要分阻塞响应和非阻塞响应,阻塞响应必须要等待线程执行结束才算完成,非阻塞响应直接扔给线程就算完。
  4. 提供一个next 方法,关联一个事件到下一个或多个事件。或者关联多个事件或一个事件到一个事件。此时的多个事件关联也是每次一个事件触发就响应一次,多个事件都发生过的实现由用户实现。
  5. 提供一个高级方法 flow 封装 next 使事件关联使用更方便。事件链中任何一个事件 error 会中断事件流。
  6. 触发事件 trigger,可以传递参数。如果是 flownext 自动关联的,总是忽略返回值。
  7. 对于 before, on ,after阶段将收到相同的触发时的参数,触发时参数可以在 before阶段被修改。
  8. 每个 eventbus 实例有独立的全局 error 事件,用户可以通过监听这个事件获取总线的错误;也应该有一个全局的独立的on 事件,用户可以通过监听这个事件获取总线的当前运行事件。
  9. 因为每个响应函数中可以随意的触发一个或多个事件,那么流程图就没法自动画出来了。要自动画流程图就需要事先列出所有可能触发的事件。这样会不会太麻烦?因为没有类型检查,很可能也会因为列出的和实际触发的不符而导致问题。这个功能要不要,很纠结,先不要了吧,还是自由一点吧。
  10. 分布式化。java 实现,需要既可以作为 jar 包库,合并到任何项目中,同时可选择监听(一个或多个)事件中心,接收远程事件。也可以单独作为 jar 包运行,成为一个事件中心。监听事件中心就是将自己按照类型注册到事件中心。触发远程事件时需要给定远程事件类型,事件中心根据类型分发给某个事件客户端。js 实现中要做 websocket 接口,可以和后台事件中心连接。

以上

等做完这一套,就相当于重新定义了一套大型分布式互联网应用程序编写方法。前台相当于是静态文件,通过 js 和后台交互(主要用 websocket ,兼容方法也可以用 ajax),不同的是url 对后台没有意义,通信全部都是基于事件的(前台的 url 可以通过 pushState 模拟,获得更好的用户体验)。整个这一套脱开了 java 的基于 servlet 的这一套 web 开发方法,成为更便捷的分布式应用编写方案。

有一个明显问题就是使用 js 和前台模版来做页面对搜索引擎不友好,所以并不适合做内容网站,而更适合做网络应用、Hybrid 移动APP、微信公众帐号。

文档导航