【问题标题】:Implementing an event bus with priorized subscribers and concurrent modification使用优先订阅者和并发修改实现事件总线
【发布时间】:2018-03-28 18:33:04
【问题描述】:

我的应用程序有几个部分需要对从其他地方触发的事件做出反应,所以我首先想到的是事件总线。这些是我看到的要求:

  • 订阅者方法应该是类型安全的
  • 实现接口(如Subscriber<T>)不是问题
  • 订阅者还应接收其注册到的类的任何子类型事件
  • 订阅者应该能够以优先级(简单的int)或在代码中硬编码的默认优先级进行注册。发布事件时,将按顺序调用订阅者。事件是可变的,并且它们的某些字段会在订阅者之间发生变化
  • 每个线程都有自己的事件总线,我会手动注册所有订阅者,因此不需要静态访问
  • 当接收到一个事件时,订阅者应该可以在不引发ConcurrentModificationException 的情况下取消订阅

我可能需要的奖金要求:

  • 在处理事件时注册新订阅者
  • 在接收事件的同时发送事件。这些将在继续当前任务之前同步处理
  • “汇集”当前没有订阅者的事件并稍后手动处理它们的选项(可能通过传递Consumer)。

Guava Eventbus 可能会做大部分事情,除了优先级。我可以使用TreeSet 创建一个简单的优先订阅者队列,但我不知道如何将它集成到 Guava 中,我不知道我是否只想依赖整个库来完成总线。

另外,我可能需要CopyOnWriteArrayList 来处理并发内容(在迭代时添加/删除),但我不知道性能影响。在这方面,一次可能不会超过 10-15 个订阅者。

【问题讨论】:

    标签: java events


    【解决方案1】:

    普通事件并非设计为可变的。您应该坚持使用不可变数据。订阅者也不打算在特定顺序内被调用或与另一个交互。 对于您的用例,您可以为每个优先级构建不同的事件总线。订阅者可以将修改后的事件的副本移交给下一个优先级总线。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多