用于初始化依赖于另一个应用程序EJB的EJB的模式

时间:2014-12-11 09:07:59

标签: java java-ee design-patterns architecture ejb-3.1

当EJB依赖于另一个仍未启动的群集中的应用程序时,我应该如何初始化EJB?

我该怎么做?

  • @PostConstruct :也许我可以循环,直到依赖EJB可用,但我担心它会超时或阻止服务器加载过程。
  • @Schedule :也许安排初始化过程以避免服务器上的阻塞,然后仅在init完成时才提供服务请求,否则会抛出错误。

您认为我应该如何进行?你能推荐我一些模式吗?

2 个答案:

答案 0 :(得分:2)

我认为以上所有建议都是有效的。我认为这是关于你问题的环境问题。

根据您是否可以独立启动A,您可以使用Gas建议的第三个元素,以确保如果B未准备好,A不会出现(并且失败或卡住)。

另一方面,如果A自动启动而您无法更改,那么这取决于您是否可以控制初始化过程发生的时间。如果你,安排整个依赖链的初始化,它应该工作,但如果你不知道或无法控制何时B上线而A将无论如何开始,那么除了B之外别无选择起来。

就个人而言,只要您正在等待的内容可以快速启动或在发生故障时快速恢复,我就会看到民意调查不是那么糟糕。

另外请注意,您是否可以通过配置控制群集的启动方式?如果您使第二个应用程序的集群始终首先启动,则可以避免此问题。

答案 1 :(得分:1)

即使您设法解决EJB的初始化,您最终也会创建依赖项。从架构上讲,初始化依赖性将撤消决定拆分App#1(网关)和App#2(服务主机)的原因。

替代建议是让它们保持独立,就像它们当前一样,而是依赖于异常处理。 如果App#2中的服务无法访问,您可以选择抛出自定义异常,例如"服务不可用,请稍后再试"或者,根据需要,在服务再次可用时汇集要执行的请求。

这也可以保护您免受启动后App#2的失败,对于e.x.如果由于某些内部错误而导致维护停止或无响应。