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

我对Java EE非常陌生,我试图理解本地接口和远程接口的概念。 我被告知,Java EE的一大优点是容易扩展(我相信这意味着你可以在不同的服务器上部署不同的组件)。 这是远程和本地接口进来吗? 如果您希望应用程序在不同的服务器上有不同的组件,您是否应该使用远程接口? 如果您的应用程序只驻留在一台服务器上,则使用本地接口?

如果我上面的假设是正确的,那么您将如何select是否使用本地或远程接口进行新的应用程序,您不确定交通量是多less? 从本地接口开始,逐步升级到适用的远程接口?

谢谢任何澄清和build议。

我对Java EE非常陌生,我试图理解本地接口和远程接口的概念。

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

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

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

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

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

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

(…)从本地接口开始,逐步升级到适用的远程接口?

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

我build议检查下面提到的资源(前两个比较老,但仍然相关,另外两个比较近)。

资源

  • 由Tyler Jewell 发布的EJB 2.0规范发布
  • 在王宇的J2EE集群的胡德之下
  • 扩展您的Java EE应用程序 Wang Yu
  • 扩展您的Java EE应用程序 – 第2部分王瑜

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

我的build议是永远不要直接编程到您的代码中的EJB接口。 总是使用定期的,面向业务的接口,对其进行编程(即在面向业务的接口上使用代码调用方法),并提供EJB“粘合”代码作为可插入的实现。 您的程序应该专注于业务逻辑,而不是EJB等实现细节。

这样,您可以轻松地在远程和本地实现之间切换 – 如果您使用IoC容器(如Spring),则只能通过configuration来完成。

关于从本地切换到远程的特别注意事项:请注意,两者之间存在一些语义差异。 例如,通过其“远程接口”调用EJB方法会导致参数被传值,而通过“本地接口”调用会导致参数被传递。 这是一个重大的区别; 所以如果你“从本地开始”,确保你devise你的系统的方式也需要考虑“远程”语义。

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

祝你好运。

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

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

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

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

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

这可能会回答你的顾虑:

一般来说,如果您打算在分布式环境中使用bean,那么您的Enterprise Java Bean将需要远程客户端视图。 具体而言,这些是与它一起工作的客户端将在不同的Java虚拟机(JVM)中的情况。 在远程客户端视图的情况下,从远程home接口和/或远程组件接口调用任何方法将通过远程方法调用(RMI)来处理。

只有在确保其他企业bean或客户机只能在单个JVM中寻址bean的情况下,EJB才能使用本地客户机视图。 如果是这种情况,这种访问将通过直接的方法调用而不是RMI进行。

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