番石榴 - 如何以漂亮的方式避免事件链接?

时间:2015-09-12 10:16:36

标签: java guava event-bus

我们说我有两件事:

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);我希望保持代码松散耦合时直接执行第二个处理程序。

1 个答案:

答案 0 :(得分:0)

EventBus(或任何事件驱动的体系结构)可以在不改变现有部件的情况下解耦组件,扩展系统,例如。你要做的是将两个事件结合在一起,这是错误的,也是错误的。

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

说出你可以做的所有事情:

  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个事件事件3 ,当您想要与 Event1 侦听器进行通信时,以及使所有事件不可变

  4. 我会选择第3种解决方案。