Guava EventBus:向多个订阅者调度事件

时间:2017-09-08 07:49:03

标签: java guava

由于Guava的EventBus文档很短,我在这里问:

有没有办法将事件分派给多个订阅者,或者是第一个合适的订阅者总是使用的事件?

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

2 个答案:

答案 0 :(得分:3)

只要事件与事件类型匹配,事件就会路由到所有已注册的订阅者。

它位于EventBus的{​​{3}}:

  

发布活动

     

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

     

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

答案 1 :(得分:0)

  

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

我想,您只需要为活动添加Cache-Control属性,并为所有处理程序添加Cache-Control。如果您有很多这样的话,那么手动操作肯定容易出错。

您可以为您的活动创建一个包装器,不允许您在不调用它的情况下访问它。像

这样的东西
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); } } }

但是,由于删除,这不适用于callAndMarkHandledUnlessHandled(Consumer<E> consumer)AtomicBoolean,因为WrappedEvent<A>没有可用的通用信息。您可以像WrappedEvent<B>一样对包装器进行子类化并使用它。这太可怕了。

如果你不想潜入其包裹,那么有意义地扩展EventBus几乎是不可能的。最简单的方法可能是分配整个包并在this line之后添加一个中断。