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

标签 java ejb cdi

我有以下情况(在 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将异步处理模型包含到规范中,但它仍在投票中。同时有两种方式“强制”异步处理:

  1. 使用 JMS - 是的,这是一个问题,因为它正在恢复到旧的 Java EE 技术。但它有效
  2. 使用@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/

相关文章:

java - 字符串比较问题

javafx-2 - 如何在 javafx2 中的 TextField 上的 focusOut 上打印一些内容

java - Weblogic如何只有一个消息驱动bean实例/线程

java - 使用 EJB 和 JPA 保留带有外键的表

java - PAX-CDI : CdiContainerFactory and BundleTracker

jpa - 通过使用 Vaadin-CDI-Integration Addon 启用 EJB 注入(inject) Vaadin 7 UI

java - 无法使用 Xuggler 通过 RTMP 向 FMS 连续不间断地发布直播流

java - 使用 docx4j 使用 Base64 图像从 HTML 生成 .docx

java - 使用 EJB 接口(interface)作为辅助类

jsf - @Produces 返回 FacesContext --- 为什么?