6

我有以下情况(在 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()方法需要两到三分钟才能返回,这对我的日程安排造成了严重破坏,因为假设它每十秒调用一次。

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

问候,斯文

4

1 回答 1

7

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

  1. 使用 JMS - 是的,这是一个杂项,因为它正在恢复到旧的 Java EE 技术。但它有效
  2. 在生产者和观察者方法上使用@Asynchronous方法,将这些方法调用拆分为单独的容器管理线程。

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

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

    @Asynchronous
    private void scheduleSomething() {
        event.fire(new SomethingChangedEvent());
    }
}
于 2013-01-24T12:03:16.123 回答