我用:
创建了一些相同类的实例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
答案 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);
}
}