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

Java事件,特别是javax.enterprise.Event.fire()的行为如何?,java,ejb,cdi,Java,Ejb,Cdi,我有以下情况(在JBossAS6和AS7上运行): 具有调度方法的单例EJB 类型为SomethingChangedEvent 考虑以下示例: @Singleton public final class Scheduler { @Inject private Event<SomethingChangedEvent> event; @Schedule private void scheduleSomething() { event.

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

  • 具有调度方法的单例EJB
  • 类型为
    SomethingChangedEvent
考虑以下示例:

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

    @Schedule
    private void scheduleSomething() {
        event.fire(new SomethingChangedEvent());
    }
}
@Singleton
公共最终类调度程序{
@注入
私人活动;
@时间表
私有的void scheduleSomething(){
event.fire(newsomethingchangedevent());
}
}
我希望将此事件添加到服务器上的某种队列中,并由其分发。将通知使用
@observators
观察此类事件的任何方法。
event.fire()
方法将立即返回

但是,我面临以下问题:有时,
event.fire()
方法需要两到三分钟才能返回,这会对我的计划造成严重破坏,因为假定它每十秒钟调用一次

所以问题是:这怎么可能?被触发但无人观察的事件会发生什么?是否存在可能溢出的队列

问候,,
Sven

CDI事件处理同步发生。事实上,在规范中包含异步处理模型是有必要的,但仍在表决中。同时,有两种方式“强制”异步处理:

  • 使用JMS-是的,这是一个难题,因为它正在恢复到旧的JavaEE技术。但它是有效的
  • 在producer和observer方法上使用一个方法,将这些方法调用拆分为单独的容器管理线程
  • 将第二种方法应用于代码示例:

    @Singleton
    public final class Scheduler {
        @Inject
        private Event<SomethingChangedEvent> event;
    
        @Asynchronous
        private void scheduleSomething() {
            event.fire(new SomethingChangedEvent());
        }
    }
    
    @Singleton
    公共最终类调度程序{
    @注入
    私人活动;
    @异步的
    私有的void scheduleSomething(){
    event.fire(newsomethingchangedevent());
    }
    }
    
    非常有趣。这解决了我的问题(希望:)。事实上,观察事件的方法被卡住了。