Java事件,特别是javax.enterprise.event.fire()的行为如何?

Sve*_*ath 6 java ejb cdi

我有以下情况(在JBoss AS6和AS7上运行):

  • 具有调度方法的Singleton EJB.
  • 注入的事件类型 SomethingChangedEvent

请考虑以下示例:

@Singleton
public final class Scheduler {
    @Inject
    private Event<SomethingChangedEvent> event;

    @Schedule
    private void scheduleSomething() {
        event.fire(new SomethingChangedEvent());
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这个事件被添加到服务器上的某种队列并由它分发.@Observers将通知使用任何观察此类事件的方法.该event.fire()方法将立即返回.

但是,我面临以下问题:有时,该event.fire()方法需要两到三分钟才能返回,因为假定每十秒钟调用一次,因此会导致我的日程安排受到严重破坏.

所以问题是:这怎么可能?被解雇的事件会发生什么,但没有人观察到它们?是否有可以溢出的队列?

此致,斯文

Per*_*ion 7

CDI事件处理同步发生.实际上有一个建议是将异步处理模型包含在规范中,但它仍然被投票.与此同时,有两种"强制"异步处理方式:

  1. 使用JMS - 是的,这是一个kludge,因为它恢复到较旧的Java EE技术.但它的确有效
  2. 在producer和observer方法上使用@Asynchronous方法,将这些方法调用拆分为单独的容器管理线程.

将第二种方法应用于您的代码示例:

@Singleton
public final class Scheduler {
    @Inject
    private Event<SomethingChangedEvent> event;

    @Asynchronous
    private void scheduleSomething() {
        event.fire(new SomethingChangedEvent());
    }
}
Run Code Online (Sandbox Code Playgroud)