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

Posted

技术标签:

【中文标题】EJB - 何时使用远程和/或本地接口?【英文标题】:EJB's - when to use Remote and/or local interfaces? 【发布时间】:2011-04-17 23:38:04 【问题描述】:

我是 Java EE 的新手,我正在尝试理解本地接口和远程接口的概念。有人告诉我,Java EE 的一大优势是易于扩展(我相信这意味着您可以在不同的服务器上部署不同的组件)。这就是远程和本地接口的用武之地吗?如果您希望您的应用程序在不同的服务器上有不同的组件,您是否应该使用远程接口?如果您的应用程序仅驻留在一台服务器上,则使用本地接口?

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

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

【问题讨论】:

【参考方案1】:

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

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

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

有人告诉我,Java EE 的一大优势是易于扩展(我相信这意味着您可以在不同的服务器上部署不同的组件)

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

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

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

(...) 开始使用本地接口,然后逐步升级到适用的远程接口?

我可能会从使用本地接口开始。正如已经暗示的那样,切换到远程接口并不总是强制性的(您可以集群一个并置结构)。

我建议检查下面提到的资源(前 2 个很旧但仍然相关,另外 2 个是较新的)。

资源

Under the Hood of J2EE Clustering by 王宇 Scaling Your Java EE Applications by 王宇 Scaling Your Java EE Applications -- Part 2 by 王宇

【讨论】:

我发现这个问题很有趣。您所说的“切换到远程接口不是绝对强制性的”是什么意思?这是否意味着当您在同一个 JVM 之外添加新客户端时,您不必创建远程接口? @Josek 谢谢,很高兴你喜欢它@mohamida 我对措辞做了些许改动。我的意思是你可以聚集一个并置的结构。 感谢您的回答和其他资源,它们非常有帮助。似乎有几种方法可以扩展 Web 应用程序......即分发组件(我认为这是将不同的层分解到不同的 JVM 上?)或使用负载平衡(这将使整个应用程序都在许多服务器?)我想你可以使用两者的组合?您是否偶然知道有关此主题的好书?再次感谢! @Brian It seems like there are a couple ways of scaling a web application (...) and I suppose you could use a combination of both? 是的,就是这样。 Do you, by chance know of good books on this topic? 遗憾的是,不,我不知道“ZE”绝对资源,如果有的话。不过,我添加了更多资源和一些参考资料。 第一个资源链接失效【参考方案2】:

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

我对你的建议是永远不要永远在你的代码中直接编写 EJB 接口。始终使用常规的、面向业务的接口,对其进行编程(意思是,让您的代码在面向业务的接口上调用方法)并提供 EJB“粘合”代码作为可插入的实现。您的程序应该专注于业务逻辑,而不是 EJB 等实现细节。

这样,您可以轻松地在远程和本地实现之间切换 - 如果您使用 Spring 等 IoC 容器,则只需配置即可。

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

如果您的设计依赖于更改传入对象的 EJB 方法,那么稍后“切换到远程”对您来说会很棘手;甚至是不可能的。

祝你好运。

【讨论】:

听起来像是另一个减少每个有效 java 的可变性的原因。这是否有助于灵活地为 EJB 的 RMI 类型接口“切换到远程”?【参考方案3】:

根据 EJB Spec 3.2,EJB 可以是本地远程。 业务接口不能同时是本地和远程的。

@Local注解的bean只有在同一个应用程序中才能被访问。

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

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

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

【讨论】:

问题:你能否使用@Local 在另一个应用程序(JAR、WAR、EAR)中调用一个 EJB,但使用相同的 JVM? @PritamBanerjee 关于 Carlitos Wa 的任何想法,我也面临同样的问题。 EJB 在不同的集群中,客户端 servlet 应用在不同的集群中。 @GovindaSakare 我不太确定。对不起:(【参考方案4】:

这可能会解决您的疑虑:

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

一个 EJB 可以使用本地客户端视图,前提是确实保证 其他企业 bean 或客户端将仅在一个 单个 JVM。如果是这种情况,此类访问将通过 直接方法调用,而不是 RMI。

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

【讨论】:

以上是关于EJB - 何时使用远程和/或本地接口?的主要内容,如果未能解决你的问题,请参考以下文章

EJB远程接口调用

ejb学习1-helloword,ejb远程调用

Wildfly 远程 EJB 调用

如何访问 EJB?

在其他模块的 JSF ManagedBean 中通过 @EJB(lookup) 注入远程无状态 EJB

无法在 JBoss 6.4 上查找远程 EJB3