gpt4 book ai didi

确保初始化所有 EAR 部件的 Java EE 方法

转载 作者:搜寻专家 更新时间:2023-11-01 03:05:16 27 4
gpt4 key购买 nike

我想知道如何确保完整应用程序的初始化,而不会出现某些应用程序组件可能被访问或触发的问题。

我说的是 Java EE 6/Java EE 7 应用程序,它们包含多个 WAR 和 EJB 组件。EAR 应用程序包含消息驱动的 bean(在不受外部访问控制的情况下触发)、Servlet(在不受用户或接口(interface)系统控制的情况下触发/访问)和 TimerEJB,它们本身由定义的计划触发。

想象一下,您必须确保在启动 EAR 应用程序时必须初始化应用程序部分。例如。您运行数据库迁移等工具,这可能需要数小时。在 Java EE 6/Java EE 7 中如何控制应用程序的上述部分甚至在 init 正确通过初始化之前都不会执行。如果初始化失败,拒绝对 Java EE 中任何服务的操作?

我希望我能以正确的方式解释我的问题。简而言之:如何在执行我的应用程序的任何其他代码之前执行“Init”代码?如果我的“初始化”代码失败,我如何避免执行任何其他代码?是否有标准的 Java EE 6/Java EE 7 方式?如果没有,有没有jboss7/wildfly的方法?

最佳答案

这是我们的做法:

对于每个应用程序/服务(ear 或 war,随您选择),都有一个“startupFinished”@Startup @Singleton。这个单例将依赖于该应用程序中的所有其他单例——那些将是完成所有实际初始化工作的单例(并且为了避免引用的惰性初始化的陷阱,最好对所有这些单例调用一些 isInitialized() 方法)。

应用程序中的所有 MDB 都依赖于该应用程序的 StartupFinished 单例(有关如何操作,请参阅 this question)。

对于跨应用程序的依赖关系(交叉耳朵)- 如果 A.ear 依赖于 B.ear,则 A 的 StartupFinished 单例注入(inject) B 的 StartupFinished(您需要将其公开为 @Remote EJB)。

更好的是,要正确执行此操作,您将需要 A 中的 StartupStarted 单例,它依赖于 B 的 StartupFinished 单例 - 以真正确保 B 在 A 开始初始化之前完全并完全启动。

关于确保初始化所有 EAR 部件的 Java EE 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24973381/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com