EJB容器负责确定何时初始化单例会话bean实例,除非使用javax.ejb.Startup批注对单例会话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。
任何使用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();
}
}