【问题标题】:Guava - how to avoid event chaining in nice way?Guava - 如何以很好的方式避免事件链接?
【发布时间】:2015-09-12 10:16:35
【问题描述】:

假设我有两个事件:

class Event1 {

}
class Event2 {
    String returnValue;
}

@Subscribe
void listenTo(Event1 ev1) {
   Event2 ev2=new Event2();
   bus.post(ev2);
   //ev2.returnValue here is null
}

@Subscribe
void listenTo(Event2 ev) {
   ev2.returnValue="returnValue";
}

当我打电话时

 bus.post(new Event1());

处理程序

void listenTo(Event2 ev) { ... }

在处理程序执行后执行

void listenTo(Event1 ev1) { ... }

完成了。这是因为 eventBus 处理队列中的事件。结果是我无法计算 ev2.returnValue - 它为空。当bus.post(ev2); 我想保持代码松散耦合时,如何以优雅的方式修改此代码以直接执行第二个处理程序。

【问题讨论】:

    标签: java guava event-bus


    【解决方案1】:

    EventBus(或任何事件驱动架构)用于解耦组件、扩展系统而不更改现有部件等。您尝试做的是将 2 个事件耦合在一起,这是错误的和误导性的。

    事件应该是不可变的,以便您可以与不同的侦听器并行运行它们,并始终获得相同的结果(否则,由于侦听器的执行顺序,您的结果可能会在运行之间变得随机)。

    说出你能做的一切:

    1. 使用 AsyncEventBus 进行处理:

      http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/eventbus/AsyncEventBus.html

      有一个 AsyncEventBus,它在 ThreadPool Executor 中调度事件,因此您的 Event2 可能与 Event1 并行运行(可能无法保证,因为线程可能很忙),你可以有一些等待逻辑来读取 Event2

    2. 您可能会直接调用您的 Event2 逻辑。

    3. 触发第 3 个事件 Event3,当您想向 Event1 侦听器传达某些内容并使所有事件不可变时。。 p>

    我会选择第三种解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      相关资源
      最近更新 更多