依赖于其他应用程序EJB的EJB初始化模式

5
当EJB依赖于另一个应用程序,该应用程序位于尚未启动的另一个群集中时,应该如何初始化它?
您应该如何处理?
  • @PostConstruct:也许我可以循环直到相关的EJB可用,但我担心它会超时或阻塞服务器加载过程。
  • @Schedule:也许可以安排初始化进程以避免服务器阻塞,然后仅在完成初始化后服务请求,否则抛出错误。
你认为我应该怎么做?你会向我推荐一些模式吗?

1
在第二个服务器上的一个应用程序中创建PostConstruct。当第二个服务器启动时,调用RMI(远程EJB)并从该EJB进行初始化。 - ashokhein
循环依赖可能是如何产生的呢?因为它是单向的。应用程序2 ---> 应用程序1。 - ashokhein
我同意这个 :) - ashokhein
1
我假设你的第一个(A)应用程序在第二个(B)完全启动之前是无法使用的。那么我认为,在B准备好之前没有启动A的必要,因此我会将其默认停止。为了避免强耦合,我可能会创建第三个应用程序 - 启动器(S),它将监视B是否准备就绪,如果准备就绪,则启动A。 - Gas
依赖的EJB是否在其应用程序启动时初始化?还是作为某种服务请求的结果发生? - Steve C
显示剩余3条评论
2个回答

2
以上所有建议我认为都是有效的,这取决于你问题周围的情况。
如果您可以独立启动A,则可以像Gas建议的那样使用第三个元素来确保A不会出现(并失败或卡住),如果B没有准备好。
另一方面,如果A自动启动而您无法更改它,则取决于您是否可以控制初始化过程发生的时间。如果可以,请安排整个依赖链的初始化,然后它应该可以工作;但是如果您不知道或无法控制B何时上线,而A无论如何都将启动,则除了轮询直到B上线外别无选择。
就个人而言,只要您等待的内容可用且在故障时快速启动或快速恢复,轮询不会那么糟糕。
另外,您不能通过其配置控制集群的启动方式吗?如果您使第二个应用程序的集群始终首先启动,则可以避免此问题。

感谢您的回答。我不知道真正的问题是基础架构(B应用程序没有集群)还是基础架构人员执行了集群重启。无论如何,正如您所说,我认为轮询对于这种情况是最好的解决方案。 - Andrés Oviedo

1
即使您成功解决了EJB的初始化问题,您最终也会创建依赖关系。从架构上讲,初始化依赖性将撤消拆分App#1(网关)和App#2(服务主机)的决定的原因。 另一种建议是保持它们独立,就像它们目前一样,并且依靠异常处理。如果App#2中的服务无法访问,您可以选择抛出自定义异常,例如“服务不可用,请稍后再试”,或者根据需要将请求池化以在服务再次可用时执行。
这还可以保护您免受启动后App#2的故障影响,例如,如果由于某些内部错误而进行维护或无响应。

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