繁体   English   中英

CDI:如何在从属bean之间广播事件?

[英]CDI: How to broadcast events between Dependent beans?

我创建了一些具有相同类的实例:

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”,而是希望通过事件与它们进行通信。 但是使用Dependent范围,每次都会将事件发送到MyObserver的新实例……而使用Dependent范围,则不能使用:

@Observes(notifyObserver = Reception.IF_EXISTS)

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

谢谢,

-鸭

从技术上讲,一种方法是使您的观察者方法静态化,但是如果您希望在事件期间对每个bean进行ping操作,那可能是相当有限的。

我认为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);
  }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM