Java Guava EventBus:将事件分派给多个订阅者

Java Guava EventBus:将事件分派给多个订阅者,java,guava,Java,Guava,由于番石榴的EventBus文档相当简短,我在此询问: 是否有方法将事件分派给多个订阅者,或者事件始终由第一个合适的订阅者使用 如果是后者,是否最好扩展EventBus类,以便添加这样的功能或在自己的应用程序中实现整个事件总线逻辑?事件将路由到所有注册的订阅者,只要它们与事件类型匹配 它位于EventBus中: 发布事件 要发布事件,只需将事件对象提供给post(对象)方法。EventBus实例将确定事件的类型并将其路由到所有注册的侦听器 事件根据其类型进行路由-对于事件可分配到的任何类型,事件

由于番石榴的
EventBus
文档相当简短,我在此询问:

是否有方法将事件分派给多个订阅者,或者事件始终由第一个合适的订阅者使用


如果是后者,是否最好扩展
EventBus
类,以便添加这样的功能或在自己的应用程序中实现整个事件总线逻辑?

事件将路由到所有注册的订阅者,只要它们与事件类型匹配

它位于
EventBus
中:

发布事件

要发布事件,只需将事件对象提供给post(对象)方法。EventBus实例将确定事件的类型并将其路由到所有注册的侦听器

事件根据其类型进行路由-对于事件可分配到的任何类型,事件将传递给任何订阅者。这包括实现的接口、所有超类以及由超类实现的所有接口

如果是后者,那么扩展EventBus类以添加这样的特性还是在自己的应用程序中实现整个事件总线逻辑更好

我想,您只需向事件添加
handled
属性,并向所有处理程序添加
testAndSet
。如果您有许多手动操作,那么手动操作肯定容易出错

您可以为您的事件创建一个包装器,它不允许您在不调用它的情况下访问它。差不多

@RequiredArgsConstructor
class WrappedEvent<E extends MyEvent> {
    private final E event;
    private boolean handled;

    Optional<E> getAndMarkHandledUnlessHandled() {
        if (handled) {
            return Optional.empty();
        } else {
            handled = true;
            return Optional.of(event);
        }
    }
}
@RequiredArgsConstructor
类包装{
私人决赛;
私有布尔处理;
可选getAndMarkHandledUnlessHandled(){
如果(已处理){
返回可选的.empty();
}否则{
已处理=正确;
返回可选。of(事件);
}
}
}
或者以更实用的方式进行操作,如
callandmarkhandleunlesshandled(Consumer-Consumer)
。对于异步分派,您将使用
原子布尔


但是,由于擦除,这在
WrappedEvent中不起作用。

非常感谢-我阅读并测试了它,但我的测试无效:我没有注册第二个侦听器;-)