Java CDI:如何在依赖bean之间广播事件?

Java CDI:如何在依赖bean之间广播事件?,java,events,jakarta-ee,cdi,Java,Events,Jakarta Ee,Cdi,我创建了一些相同类的实例: private Instance<MyObserver> myObserverFactory; public MyObserver getNewInstance() { return myObserverFactory.get(); } 与保留所有MyObserver实例的“managerbean”不同,我希望通过事件与它们通信。 但在dependent作用域中,事件每次都会发送到MyObserver的新实例。。。对于从属范围,我不能使用: @Ob

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

private Instance<MyObserver> myObserverFactory;

public MyObserver getNewInstance() {
  return myObserverFactory.get();
}
与保留所有MyObserver实例的“managerbean”不同,我希望通过事件与它们通信。 但在dependent作用域中,事件每次都会发送到MyObserver的新实例。。。对于从属范围,我不能使用:

@Observes(notifyObserver = Reception.IF_EXISTS)
所以我的问题是:如何在现有的从属作用域bean之间广播事件? 我可以使用什么范围

谢谢


-Dush

从技术上讲,一种方法是使您的观察者方法保持静态,但如果您希望在事件期间ping每个bean,那么这可能是非常有限的。

我认为Adrian Mitev是正确的:我不可能按照自己的意愿这样做

为此,我使用了(能够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);
  }

}

我认为这是不可能的,因为为了满足这一要求,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);
  }

}