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


180

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

如果我的上述假设是正确的,那么您将如何选择是对新应用程序使用本地接口还是远程接口,而又不确定流量的大小呢?首先使用本地接口,然后在适用的情况下逐步升级到远程接口?

感谢您的澄清和建议。

Answers:


186

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

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

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

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

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

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

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

(...)首先使用本地接口,然后逐步升级到远程接口(如果适用)?

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

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

资源资源


2
我发现这个问题很有趣。您“不是绝对强制切换到远程接口”是什么意思?这是否意味着当您在同一JVM外部添加新客户端时,您不必建立远程接口?
mohamida

2
@Josek谢谢,很高兴您喜欢@mohamida我的措辞略有更改。我的意思是,您可以将一个并置的结构聚类。
Pascal Thivent

1
感谢您的回答和其他资源,它们对您有所帮助。似乎有几种扩展Web应用程序的方法……即分配组件(我将其分解为不同的层到不同的JVM?)或使用负载平衡(将整个应用程序放在众多服务器?),我想您可以将两者结合使用?您是否偶然知道有关该主题的好书?再次感谢!
Brian DiCasa

2
@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”绝对资源,如果有的话。我已经添加了更多参考资源。
Pascal Thivent

第一条资源链接已
消失

48

尽管我同意上面的大部分内容,但我还是想稍微完善一下“如何开始”的想法。

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

这样,您可以轻松地在远程和本地实现之间进行切换-如果使用的是IoC容器(例如Spring),则只能通过配置来实现。

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

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

祝好运。


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

19

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

@Local 带注释的Bean仅在它们位于同一应用程序中时才能被访问。

@Remote 可以在不同的应用程序中(位于不同的jvm中)或跨应用程序服务器访问带注释的Bean。

因此要记住的重要事项是:

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

1
问题:您可以@Local用来在另一个具有相同JVM的应用程序(JAR,WAR,EAR)中调用EJB吗?
卡利托斯之路

@PritamBanerjee关于Carlitos Wa的任何想法,我也面临着同样的问题。EJB位于不同的集群中,而客户端servlet应用位于不同的集群中。
Govi S

@GovindaSakhare我对此不太确定。抱歉:(
Pritam Banerjee

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.