当前位置: 首页 > 知识库问答 >
问题:

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

强金鑫
2023-03-14

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

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

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

共有2个答案

周墨一
2023-03-14

如果是后者,那么扩展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);
        }
    }
}

或者以更实用的方式进行操作,如callAndMarkHandledUnlessHandled(消费者

但是,由于擦除,这将不适用于WrappedEvent

如果您不想潜入其包中,那么很难有意义地扩展EventBus。最简单的方法可能是将整个包分叉,并在这一行之后添加一个中断。

梅修贤
2023-03-14

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

它位于EventBus的Javadoc中:

发布事件

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

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

 类似资料:
  • 我正在寻找一种将多个订阅者附加到RxJava可观察流的方法,每个订阅者异步处理发出的事件。 我第一次尝试使用。flatMap(),但这似乎对任何后续订阅服务器都不起作用。所有订阅服务器都在同一线程上处理事件。 最终工作的是通过每次创建一个新的可观察的来消耗新线程中的每个事件: 输出: 以及多个订阅者的最终结果: 输出: 然而,这似乎有点笨拙。有没有更优雅的解决方案,或者RxJava不是一个很好的用

  • 我正在用Scala编写一个GUI,在尝试在一个foreach语句中注册按钮事件时遇到了一个奇怪的问题:对于对象列表中的每个元素(对象0)…对象n),检索相应的按钮x=按钮i,并用代码框订阅给定框。listenTo(x)。按下按钮时,应执行与对象相关的一些操作(在这种情况下,): 但是,我得到了一些非常奇怪的行为,单击任何按钮都会触发所有此类对象操作——请参阅程序输出: 我完全不知道为什么会这样;无

  • 本文向大家介绍如何在C#中订阅事件,我们可以在C#中为一个事件拥有多个订阅者吗?,包括了如何在C#中订阅事件,我们可以在C#中为一个事件拥有多个订阅者吗?的使用技巧和注意事项,需要的朋友参考一下 事件使类或对象在发生感兴趣的事件时通知其他类或对象。 引发事件的类称为发布者,而处理事件的类称为订阅者。 在事件中 一个事件可以有多个订阅者。订阅者可以处理来自多个发布者的多个事件。 没有订阅者的事件永远

  • Node.js应用程序可以使用composer-client.BusinessNetworkConnection.onAPI调用从业务网络订阅事件。事件在业务网络模型文件中定义,并由交易处理函数文件中的指定交易处理。有关发布事件的更多信息,请参阅发布事件。 在你开始之前 在应用程序可以订阅事件之前,你必须定义一些事件和发送它们的交易。还必须部署业务网络,并且必须具有可连接到该业务网络的连接配置文件

  • 所以,在上面的例子中,可以看到有2个订阅者接受相同类型的处理。现在,在post()的时候,所有的函数都将被调用吗?如果接收StartRequest的两个函数将被调用,那么它们将以哪种顺序被调用?

  • 我通读了RxJS文档,并希望确保我理解了< code > subscriber . unsubscribe()和< code > subscriber . complete()之间的区别。 假设我有一个有两个订阅者的可观察对象,订阅者1和订阅者2。如果订阅者1对其订阅调用取消订阅,它将不再接收来自可观察对象的通知,但订阅者2将继续接收它们。 <代码>的文档。complete(): 观察者回调,用于