启动单例 bean 可以延迟 J2EE 容器初始化吗?

Can a startup singleton bean delay a J2EE container initialization?

根据 Java EE 6 Tutorial:

The EJB container is responsible for determining when to initialize a singleton session bean instance unless the singleton session bean implementation class is annotated with the javax.ejb.Startup annotation. In this case, sometimes called eager initialization, the EJB container must initialize the singleton session bean upon application startup. The singleton session bean is initialized before the EJB container delivers client requests to any enterprise beans in the application.

我的RESTEasy application served by Thorntail不使用任何EJB,但它在应用程序服务器初始化期间使用@Startup、@Singleton 和@PostConstruct 注释来运行 一个长时间的数据库更新任务。它是这样的:

@Startup
@Singleton
public class StartupTask {

  @PostConstruct
  void init {
    // database update task
  }
}

在此任务完成之前,我的应用程序能否处理 HTTP 请求?

我的问题类似于

任何用 javax.ejb.Singleton 注释的 bean 都是一个 EJB,并受您在问题中引用的条件的约束。

您可以通过将 "database update task" 逻辑移动到第二个 EJB 来避免延迟:

@Stateless
public class DatabaseUpdater {

    @Resource
    private Datasource dataSource;

    // OR

    @PersistenceContext
    private EntityManager em;

    @javax.ejb.Asynchronous
    public void updateDatabase() {
        // beware of long running transaction timeouts in here!
        ...
    }

}

然后从您的@Startup bean 调用它:

@Startup
@Singleton
public class StartupTask {

    @EJB
    private DatabaseUpdater databaseUpdater;

    @PostConstruct
    void init {
        databaseUpdater.updateDatabase();
    }

}