实现具有优先订阅者和并发修改的事件总线

时间:2018-03-27 08:09:47

标签: java events

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

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

我可能需要的奖金要求:

  • 处理事件时注册新订阅者
  • 收到活动时发送活动。这些将在继续当前任务之前同步处理
  • &#34; pool&#34;的选项当前没有订阅者的事件,稍后手动处理它们(可能通过传递Consumer)。
除了优先级之外,Guava Eventbus可能会做大部分事情。我可以使用TreeSet创建一个简单的优先订阅者队列,但我不确定如何将其集成到Guava中我不知道我是否只想依赖于整个库公共汽车。

另外,对于并发的东西(迭代时添加/删除)我可能需要CopyOnWriteArrayList,但我不知道性能影响。在那个问题上,一次可能不会超过10-15个订阅者。

1 个答案:

答案 0 :(得分:0)

正常事件不是设计为可变的。你应该坚持使用不可变数据。订阅者也不是要在某个顺序中调用或与另一个订阅者进行交互。 对于您的用例,您可以为每个优先级构建不同的事件总线。订户可以将修改后的事件的副本切换到下一个优先级总线。