CDI:如何在Dependent beans之间广播事件?

时间:2014-03-27 10:27:46

标签: java events java-ee cdi

我用:

创建了一些相同类的实例
private Instance<MyObserver> myObserverFactory;

public MyObserver getNewInstance() {
  return myObserverFactory.get();
}

我的班级:

// Dependent bean
public class MyObserver{
   public void observe(@Observes MyEvent myEvent) { /* do something */ }
}

我想与所有 MyObserver 实例保持“管理bean”,而不是通过事件与他们沟通。 但是使用依赖范围,事件每次都会发送到 MyObserver 的新实例...并且使用Dependent范围,我无法使用:

@Observes(notifyObserver = Reception.IF_EXISTS)

所以我的问题是:如何在现有的Dependent范围bean之间广播事件? 我可以使用什么范围?

谢谢,

-Dush

2 个答案:

答案 0 :(得分:0)

从技术上讲,一个方法是让你的观察者方法保持静态,但如果你想在事件期间ping每个bean,这可能是非常有限的。

答案 1 :(得分:0)

我认为Adrian Mitev是对的:我不可能按照自己的意愿去做。

我正在使用Guava Event Bus来实现此目的(能够ping现有的bean实例)。我正在使用这个类将CDI事件路由到它:

/**
 * Configure Guava Event Bus to get CDI event and broadcast them to it.
 */
@ApplicationScoped
public class GuavaEventBus {

  private static final Logger LOGGER = LoggerFactory.getLogger(GuavaEventBus.class);

  private static final EventBus eventBus = new EventBus();

  @Produces
  @ApplicationScoped
  private EventBus createGuavaEventBus() {
      return eventBus;
  }

  public void broadcastEveryEvent(@Observes Object event) {
      // There are a lot of bradcasted events, it may be a good solution to filter them.
      LOGGER.debug("Broadcast event: {}", event);
      eventBus.post(event);
  }

  /** Why not registring and unregistring by CDI event? ;) */ 
  public static void register(Object bean) {
      LOGGER.debug("Register bean: {}", bean);
      eventBus.register(bean);
  }

  public static void unregister(Object bean) {
      eventBus.unregister(bean);
  }

}