EJB - 何时使用远程和/或本地接口?

Bri*_*asa 177 java ejb java-ee

我是Java EE的新手,我正在尝试理解本地接口和远程接口的概念.我被告知Java EE的一大优势是它易于扩展(我相信这意味着您可以在不同的服务器上部署不同的组件).是远程和本地接口进来的地方吗?如果您希望应用程序在不同的服务器上具有不同的组件,您是否应该使用远程接口?如果您的应用程序只驻留在一台服务器上,请使用本地接口?

如果我的上述假设是正确的,那么您将如何选择是否为新应用程序使用本地或远程接口,而您不确定流量的大小是多少?从使用本地接口开始,逐步升级到适用的远程接口?

感谢您的任何澄清和建议.

Pas*_*ent 180

我是Java EE的新手,我正在尝试理解本地接口和远程接口的概念.

在EJB规范的初始版本中,EJB被"假定"为远程组件,调用它们的唯一方法是使用RMI语义和它所暗示的所有开销(每个网络调用和对象序列化)进行远程调用.方法调用).即使与EJB容器在同一虚拟机中并置时,EJB客户端也必须支付此性能损失.

后来,Sun意识到大多数业务应用程序实际上并没有在不同的层上分发EJB,并且他们通过引入Local接口的概念来修复规范(在EJB 2.0中),以便与EJB容器在同一虚拟机中并置的客户端可以使用EJB调用EJB直接方法调用,完全绕过RMI语义(以及相关的开销).

我被告知Java EE的一大优势是它易于扩展(我相信这意味着你可以在不同的服务器上部署不同的组件)

Java EE可以扩展,但这并不一定意味着分发组件.您可以在集群上运行Web + EJB应用程序,而无需分离Web层和EJB层.

如果您希望应用程序在不同的服务器上具有不同的组件,您是否应该使用远程接口?如果您的应用程序只驻留在一台服务器上,请使用本地接口?

我会这样说:如果客户端不在同一个JVM中,则使用远程接口(这并不意味着只使用一个服务器/ JVM).

(...)使用本地接口启动,并逐步升级到适用的远程接口?

我可能会开始使用本地接口.正如已经暗示的那样,切换到远程接口并不总是强制性的(您可以对并置的结构进行聚类).

我建议检查下面提到的资源(前两个是相当陈旧但仍然相关,另外两个是最近的).

资源

  • 我觉得这个问题很有意思."切换到远程接口并不是绝对必要的"是什么意思?这是否意味着当您在同一JVM外部添加新客户端时,您不必创建远程接口? (2认同)
  • @Josek谢谢,很高兴你喜欢@mohamida我对措辞做了一些改动.我的意思是你可以聚集一个并置的结构. (2认同)
  • 感谢您的回答和额外资源,他们非常有帮助。似乎有几种方法可以扩展 Web 应用程序......即分发组件(我认为这是将不同的层分解到不同的 JVM 上?)或使用负载平衡(这将使整个应用程序都在许多服务器?)我想你可以使用两者的组合?您是否偶然知道有关此主题的好书?再次感谢! (2认同)
  • @Brian`似乎有几种方法可以扩展Web应用程序(...),我想你可以使用两者的组合?"是的,就是这样."你是否偶然知道关于这个主题的好书?"可悲的是,不,我不知道"ZE"的绝对资源,如果有的话.我已经添加了更多资源和一些参考资料. (2认同)

Isa*_*aac 47

虽然我同意上面写的大部分内容,但我想稍微改进一下"如何开始"的想法.

我给你的建议是从来没有直接编程到你的代码中的EJB接口.始终使用常规的,面向业务的接口,对其进行编程(意味着,在面向业务的接口上使用代码调用方法)并将EJB"粘合"代码作为可插入的实现提供.您的程序应该专注于业务逻辑,而不是EJB等实现细节.

这样,您可以轻松地在远程和本地实现之间切换 - 如果您使用Spring等IoC容器,您只能通过配置来实现.

关于从本地切换到远程的特别说明:请注意,两者之间存在一些语义差异.例如,通过其"远程接口"调用EJB方法会导致参数按值传递,而通过"本地接口"调用会导致参数通过引用传递.这是一个主要的区别; 因此,如果您"从本地开始",请确保以一种考虑"远程"语义的方式设计您的系统.

如果你的设计依赖于EJB方法改变传入的对象,那么你以后"切换到远程"会很棘手; 也许甚至不可能.

祝好运.

  • 听起来又是每个有效Java尽量减少可变性的另一个原因。这是否有助于灵活地实现与EJB的RMI类型接口的“切换到远程”? (2认同)

Pri*_*jee 16

根据EJB 3.2规格的EJB可以是是本地远程.业务接口不能同时是本地和远程的.

@Local 只有在同一个应用程序中才能访问带注释的bean.

@Remote 带注释的bean可以跨不同的应用程序访问,驻留在不同的jvms或跨应用程序服务器.

所以要记住的重要事项是:

  1. 如果bean类包含@Remote注释,则所有实现的接口都是远程的.
  2. 如果bean类不包含注释或者@Local指定了注释,则假定所有实现的接口都是本地的.
  3. 必须将为不包含接口的bean显式定义的任何接口声明为@Local.
  4. EJB 3.2版本倾向于为需要显式定义本地和远程接口的情况提供更多粒度.


Abd*_*ziz 7

这可能会回答您的疑虑:

通常,在计划在分布式环境中使用bean时,Enterprise Java Bean将需要远程客户端视图.具体来说,这些是将使用它的客户端将位于不同的Java虚拟机(JVM)中的情况.在远程客户端视图的情况下,将通过远程方法调用(RMI)处理从远程主接口和/或远程组件接口调用任何方法.

只有在确实其他企业bean或客户端仅在单个JVM中寻址bean时,EJB才能使用本地客户端视图.如果是这种情况,将使用直接方法调用而不是RMI执行此类访问.

资料来源:http://www.onjava.com/pub/a/onjava/2004/11/03/localremote.html?page= last& x- showcontent= text