我有以下情况(在 JBoss AS6 和 AS7 上运行):
- 具有预定方法的单例 EJB。
SomethingChangedEvent
类型的注入(inject)事件
考虑以下示例:
@Singleton
public final class Scheduler {
@Inject
private Event<SomethingChangedEvent> event;
@Schedule
private void scheduleSomething() {
event.fire(new SomethingChangedEvent());
}
}
我希望这个事件被添加到服务器上的某种队列中并由它分发。任何使用 @Observers
观察此类事件的方法都会收到通知。 event.fire()
方法将立即返回。
但是,我面临以下问题:有时,event.fire()
方法需要两到三分钟才能返回,这对我的日程安排造成了严重破坏,因为它假定每隔十秒。
所以问题是:这怎么可能?触发但没有人观察到的事件会怎样?是否存在可以溢出的队列?
问候, 斯文
最佳答案
CDI 事件处理同步发生。实际上有一个proposal将异步处理模型包含到规范中,但它仍在投票中。同时有两种方式“强制”异步处理:
- 使用 JMS - 是的,这是一个问题,因为它正在恢复到旧的 Java EE 技术。但它有效
- 使用@Asynchronous生产者和观察者方法上的方法,将这些方法调用拆分为单独的容器管理线程。
将第二种方法应用于您的代码示例:
@Singleton
public final class Scheduler {
@Inject
private Event<SomethingChangedEvent> event;
@Asynchronous
private void scheduleSomething() {
event.fire(new SomethingChangedEvent());
}
}
关于java - Java 事件,特别是 javax.enterprise.event.fire() 的行为如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14499589/