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

时间:2013-01-24 10:53:43

标签: 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());
    }
}

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

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

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

此致 斯文

1 个答案:

答案 0 :(得分:7)

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

  1. 使用JMS - 是的,这是一个kludge,因为它正在恢复到较旧的Java EE技术。但是它有效。
  2. 对生产者和观察者方法使用@Asynchronous方法,将这些方法调用拆分为单独的容器管理线程。
  3. 将第二种方法应用于您的代码示例:

    @Singleton
    public final class Scheduler {
        @Inject
        private Event<SomethingChangedEvent> event;
    
        @Asynchronous
        private void scheduleSomething() {
            event.fire(new SomethingChangedEvent());
        }
    }