Eager / 自动加载 EJB / 在启动时加载 EJB (在 JBoss 上)

22

EJB似乎是懒加载的 - 即每次访问时才会加载。

然而,我希望能够主动初始化它们 - 即在容器启动时就初始化。如何实现这一点(特别是在JBoss中)?

这个主题提供了一些提示,但并不完全令人满意。

2个回答

23

从EJB 3.1开始,单例Bean可以被通知模块的启动和停止:

@Singleton
@Startup
public class StartupBean {
    @PostConstruct
    private void postConstruct() { /* ... */ }

    @PreDestroy
    private void preDestroy() { /* ... */ }
}

在EJB 3.1之前,没有标准的、仅限于EJB的解决方案。我建议将一个WAR添加到你的EAR中,并使用一个servlet-context-listener。


我发现我的应用在GlassFish 3.1中,@Singleton @Startup EJB得到的@PersistenceContext EntityManager是关闭的。我的解决方法是在该EJB中设置一个定时器,2秒后执行。(呃!) - Hendy Irawan
3
那听起来像是一个漏洞,我建议报告一下。 - Brett Kail

18
根据Adam Bien的《Real World Java EE Patterns - Rethinking Best Practices》(查看模式摘要)和Service Starter模式,正如bkail所建议的那样:
  • 在Java EE 6 = EJB 3.1中,使用@Singleton和@Startup(可能还包括@DependsOn)
  • 在此之前,唯一标准且可移植的方法是使用Servlet API,例如在其init()方法中启动EJB并将load-on-startup设置为1。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接