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

时间:2019-04-28 19:54:25

标签: java java-ee ejb-3.1

根据Java EE 6 Tutorial

  

除非使用javax.ejb.Startup注释对单例会话Bean实现类进行注释,否则EJB容器负责确定何时初始化单例会话Bean实例。在这种情况下,有时称为急切初始化,EJB容器必须在应用程序启动时初始化单例会话bean。 在EJB容器将客户端请求传递到应用程序中的任何企业bean之前,将初始化单例会话bean。

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

@Startup
@Singleton
public class StartupTask {

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

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

我的问题类似于this one

1 个答案:

答案 0 :(得分:1)

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

您可以通过将“数据库更新任务”逻辑移至第二个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();
    }

}