我想知道如何确保完整应用程序的初始化,而不会遇到可能访问或触发某些应用程序组件的问题。
我在谈论Java EE 6 / Java EE 7应用程序,它们包含多个WAR和EJB组件。 EAR应用程序包含消息驱动的bean(在没有外部访问控制的情况下触发),Servlet(在没有用户或接口系统控制的情况下触发/访问)和TimerEJB,它们本身由定义的时间表触发。
想象一下,您必须确保在启动EAR应用程序时必须初始化应用程序部件。例如。您运行数据库迁移等工具,这可能需要数小时。 在Java EE 6 / Java EE 7中如何控制在init正确地通过初始化之前,甚至不会执行应用程序的上述部分中的任何部分。 如果初始化失败,拒绝对Java EE中的任何服务进行操作?
我希望我能以正确的方式解释我的问题。简而言之:如何在执行我的应用程序的任何其他代码之前执行“Init”代码?如果我的“Init”代码失败,我怎么能避免执行任何其他代码? 是否有标准的Java EE 6 / Java EE 7方式?如果没有,是否有jboss7 / wildfly方式?
答案 0 :(得分:3)
这是我们如何做到的:
对于每个应用程序/服务(耳朵或战争,请选择),有一个“startupFinished”@Startup @Singleton。 这个单例将取决于该应用程序中的所有其他单例 - 那些将完成所有实际初始化工作的单例(并且为了避免使用延迟初始化引用的陷阱,最好在所有这些上调用一些isInitialized()方法)。
应用程序中的所有MDB都依赖于该应用程序的StartupFinished单例(请参阅this question了解如何)。
跨应用程序的依赖关系(交叉耳朵) - 如果A.ear依赖于B.ear有A的StartupFinished单例注入B的StartupFinished(您需要将其公开为@Remote EJB)。
更好的是,为了做到这一点,你需要一个依赖于B的StartupFinished的A中的StartupStarted单例 - 确保在A开始初始化之前B完全完全启动。