当前位置: 首页 > 知识库问答 >
问题:

启动单例bean能否延迟J2EE容器初始化?

锺离烈
2023-03-14

根据JavaEE 6教程:

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

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

@Startup
@Singleton
public class StartupTask {

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

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

我的问题和这个问题相似。

共有1个答案

赵征
2023-03-14

任何用javax注释的bean。ejb。Singleton是一个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!
        ...
    }

}

然后从@startupbean调用它:

@Startup
@Singleton
public class StartupTask {

    @EJB
    private DatabaseUpdater databaseUpdater;

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

}
 类似资料:
  • 7.4.4 延迟初始化的bean 默认情况下,ApplicationContext实现在初始化过程中随即创建和配置所有单例bean。一般来说,这种预实例化是可取的,因为可以立即发现配置或周围环境中的错误,而不是在几个小时甚至几天以后。当这种行为不可取时,可以通过将bean定义标记为延迟初始化来阻止预实例化。延迟初始化的bean告诉IoC容器,当bean首次被请求时而不是在启动时创建一个实例。 在X

  • 问题内容: 我想延迟控制器的初始化,直到从服务器收到必要的数据为止。 我找到了针对Angular1.0.1的解决方案:延迟AngularJS路由更改,直到加载模型以防止闪烁,但无法使其与Angular1.1.0一起使用 模板 ​ JavaScript http://jsfiddle.net/dTJ9N/1/ 问题答案: 由于$ http返回了promise,因此创建自己的deferred仅在htt

  • 问题内容: 这是一个非常广泛的枚举单例代码: 一堆地方说这是一个懒惰的初始化。但我很困惑我“读的第7章后,里面的Java虚拟机 ” -一个类型的生命周期: Java虚拟机规范在类和接口加载和链接的时间上为实现提供了灵活性,但严格定义了初始化的时间。所有实现都必须在首次使用时初始化每个类或接口。以下六种情况可作为有效使用: 将创建一个类的新实例(以字节码表示,一条新指令的执行。或者,通过隐式创建,反

  • 本文向大家介绍Python性能提升之延迟初始化,包括了Python性能提升之延迟初始化的使用技巧和注意事项,需要的朋友参考一下 所谓类属性的延迟计算就是将类的属性定义成一个property,只在访问的时候才会计算,而且一旦被访问后,结果将会被缓存起来,不用每次都计算。构造一个延迟计算属性的主要目的是为了提升性能 property 在切入正题之前,我们了解下property的用法,property可

  • 我有一个应用程序,我正在扩展它以提供REST API。在主站点中一切正常,但当我尝试访问REST API时,我在异常日志中得到以下内容: 禁用延迟加载将解决此问题,但会导致不可接受的性能(加载时间从 200 毫秒到 22 秒)。我不知道如何处理这个问题。 我刚开始在ColdFusion中Rest,在我看来,CFC正在以一种不寻常的方式被处理。它们似乎没有被初始化(init方法似乎没有运行),现在看

  • 问题内容: 我有一些已经在使用的JBoss webapp,还有一个懒惰的初始化问题。因此,建议我在Spring进行调查并使用。 但是,我仍然会收到错误消息,希望您能对我有所帮助?要使用Spring OEM过滤器,我还需要在应用程序中进行哪些更改? 我的设置是这样的: + jsf的东西。 我将其设置如下:web.xml applicationContext.xml: persistence.xml: