启动单例bean可以延迟J2EE容器初始化吗? [英] Can a startup singleton bean delay a J2EE container initialization?

查看:94
本文介绍了启动单例bean可以延迟J2EE容器初始化吗?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据 Java EE 6教程


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

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

My RESTEasy application served by Thorntail doesn't use any EJB, but it uses @Startup, @Singleton and @PostConstruct annotations to run a long database update task during the initialization of the application server. It is something like this:

@Startup
@Singleton
public class StartupTask {

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

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

Will my application be able to process HTTP requests before this task completes?

我的问题类似于这个

推荐答案

任何带有 javax.ejb.Singleton 是EJB,并且要遵循您引用的条件

Any bean annotated with javax.ejb.Singleton is an EJB and subject to the conditions that you quoted in your question.

您可以通过将数据库更新任务逻辑移动到第二个EJB来避免延迟:

You can circumvent the delay by moving your "database update task" logic to a second 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调用它:

and then call it from your @Startup bean:

@Startup
@Singleton
public class StartupTask {

    @EJB
    private DatabaseUpdater databaseUpdater;

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

}

这篇关于启动单例bean可以延迟J2EE容器初始化吗?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆