启动单例 Bean 是否可以延迟 J2EE 容器初始化



根据Java EE 6教程:

EJB 容器负责确定何时初始化单例会话 Bean 实例,除非使用javax.ejb.Startup 注释了单例会话 Bean 实现类。在这种情况下(有时称为预先初始化(,EJB 容器必须在应用程序启动时初始化单例会话 Bean。在 EJB 容器将客户机请求传递给应用程序中的任何企业 Bean 之前,将初始化单例会话 Bean

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

@Startup
@Singleton
public class StartupTask {
  @PostConstruct
  void init {
    // database update task
  }
}

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

我的问题与此类似。

任何用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豆中调用它:

@Startup
@Singleton
public class StartupTask {
    @EJB
    private DatabaseUpdater databaseUpdater;
    @PostConstruct
    void init {
        databaseUpdater.updateDatabase();
    }
}

最新更新