EventBus

消息总线, 望文生义, 发布订阅者模式中用来做事件调度的组件

下文基於guava-18.0

EventBus 比較值得学习的是:

  • com.google.common.eventbus.EventBus#subscribersByType

    SetMultimap<Class<?>, EventSubscriber> subscribersByType

    以 event object 作为 key, method 为方法

    这样在消费event的时候, 可以根据 event object 快速找出所有的订阅者方法(@Subscribe)

    注册消费者的方法可以借鉴
    -> com.google.common.eventbus.EventBus#register
    -> com.google.common.collect.Multimap#putAll

  • AsyncEventBus

    异步的消息总线, 其实就是继承EventBus之后重写了3个方法:

    • enqueueEvent: event入队列

      • EventBus: 使用ThreadLocal隔离多线程, 每个线程自己处理自己的event
      • AsyncEventBus: 使用ConcurrentLinkedQueue解决并发, 使得任务调度更高效
    • dispatchQueuedEvents: 调度队列中的 event

      几乎没什么区别, 都是循环拿event进行调度

      • EventBus: 还要用isDispatching设置是否正在执行的开关, 感觉有点鸡肋
    • dispatch: 调度方法

      • EventBus: 反射调用真实的订阅者(method.invoke(target, new Object[] { event }))
      • AsyncEventBus: 使用 Executor 异步调度: super.dispatch

参考

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注