【发布时间】:2018-03-28 18:33:04
【问题描述】:
我的应用程序有几个部分需要对从其他地方触发的事件做出反应,所以我首先想到的是事件总线。这些是我看到的要求:
- 订阅者方法应该是类型安全的
- 实现接口(如
Subscriber<T>)不是问题 - 订阅者还应接收其注册到的类的任何子类型事件
- 订阅者应该能够以优先级(简单的
int)或在代码中硬编码的默认优先级进行注册。发布事件时,将按顺序调用订阅者。事件是可变的,并且它们的某些字段会在订阅者之间发生变化 - 每个线程都有自己的事件总线,我会手动注册所有订阅者,因此不需要静态访问
- 当接收到一个事件时,订阅者应该可以在不引发
ConcurrentModificationException的情况下取消订阅
我可能需要的奖金要求:
- 在处理事件时注册新订阅者
- 在接收事件的同时发送事件。这些将在继续当前任务之前同步处理
- “汇集”当前没有订阅者的事件并稍后手动处理它们的选项(可能通过传递
Consumer)。
Guava Eventbus 可能会做大部分事情,除了优先级。我可以使用TreeSet 创建一个简单的优先订阅者队列,但我不知道如何将它集成到 Guava 中,我不知道我是否只想依赖整个库来完成总线。
另外,我可能需要CopyOnWriteArrayList 来处理并发内容(在迭代时添加/删除),但我不知道性能影响。在这方面,一次可能不会超过 10-15 个订阅者。
【问题讨论】: