为什么我们需要单独的EJB 3.0会话Bean的远程和本地接口

我想知道为什么我们需要单独的EJB 3.0 Session Bean的远程和本地接口。 我想大多数时候他们都会定义同样的合同。 为什么不能有一个共同的接口,在我的Bean中,我应该可以说我想要这个bean远程访问和/或本地访问。

感谢Vikas

这是EJB规范所说的:

本地和远程编程模型之间的select是Bean Provider在开发企业bean时所做的devise决定。
虽然可以为企业bean提供远程客户端视图和本地客户端视图,但通常只提供一个或另一个

JSR220第3章

所以在编写一个bean时,要考虑谁是客户端,本地客户端不太可能需要相同的方法,甚至不需要和远程方法相同的bean。

我不同意,在devise时,遥远和本地应该被认为是可以互换的。

首先,远程调用会有开销,因此在devise远程接口时,需要仔细考虑是否已经获得了粒度和参数大小。 所以提醒一下,这将是相当昂贵的作为devise师是有帮助的。

另外,鉴于远程接口参数通过值传递,本地接口参数通过引用传递,这两种情况之间存在基本的语义差异,因此您可以select以不同的方式devise这两个接口。

“位置透明”的概念是一种危险的反模式。 您的devise绝对需要知道是否进行本地呼叫或远程调用,原因很多(error handling和性能是最明显的)。

远程EJB接口与本地对象不同,因为exception签名需要有所不同,以适应只能在远程调用中发生的与networking有关的错误。 将远程处理行李托pipe到本地接口(如EJB 1中的情况)使代码变得可怕。 EJB 2引入了单独的本地接口,以简化对始终本地EJB的编程。

我相信当你的业务需要Local中的所有方法也需要暴露给远程客户端的时候

  1. 有您的本地接口与方法定义。
  2. 让你的远程接口为空而扩展本地接口
  3. 在本地拥有所有实际的业务逻辑和其他实现
  4. 让你的远程bean实现只是委托给本地的bean实现

这种方法可能是为了实现@Local和@Remote到相同的接口。 如果需要,可以在本地访问相同的方法,如果需要,可以远程访问,无需任何性能开销

这是我的想法。 有人请让我知道你的想法来validation这一点。

客户端通过bean的接口访问会话或实体bean。 EJB容器生成接口实现来执行和pipe理这种行为,充当客户端和bean之间通信的通道。 在EJB 2.0规范之前的版本中,所有的bean都被定义和实现为分布式的远程组件。 因此,bean所需的两个接口被称为home接口(通常定义生命周期方法)和远程接口(通常定义function性业务方法)。

Internally, J2EE uses the Java Remote Method Invocation over Internet Inter-ORB Protocol (RMI-IIOP) to enable remote, distributed method calls and applications. While this approach provides many benefits, it also generates a large amount of overhead, with a corresponding performance hit as stubs are referenced, parameters go through the marshaling process, and objects are tossed around the network. Considerations of performance, practicality, and typical usage in the field resulted in the introduction of local interfaces in the EJB 2.0 specification. As noted, prior terminology referred to the home interface and the remote interface; at this point, depending on which approach is used, local interface and local home interface or remote interface and remote home interface are better terms. Either of the local home or remote home interfaces is referred to as the home interface; either of the local or remote interfaces is referred to as the component interface. This tutorial refers to the interfaces in these terms and uses these conventions for names. When using J2EE technologies, it is normal to focus on distributed, or remote, beans, but you should keep the local option in mind, when applicable. It may be surprising to learn that a bean can have local interfaces, remote interfaces, or both. However, the client must write to a specific (that is, local or remote) interface. There are some issues to keep in mind when using local interfaces: 

豆必须运行在同一个虚拟机 – 毕竟,它们是本地的。 参数是通过引用发送的,而不是被复制,就像远程接口和对象一样。 如果您忽略这种区别,并且不相应编码,则可能会导致意外的副作用。 通常,使用本地或远程访问的决定受以下影响:

客户端types – 除非您始终期望客户端是Web组件或另一个Bean,否则请select远程访问。

无论bean是紧密耦合还是松散耦合 – 如果bean相互依赖并频繁交互,请考虑本地访问。

可伸缩性 – 远程访问本质上是可扩展的,如果可伸缩性是一个重要因素,应该使用远程访问。 随着EJB 2.0规范中的本地接口的出现,大多数资源build议实体bean几乎总是基于本地访问。 有了本地接口,关于非常细粒度的数据访问的大多数性能问题就消失了。 如果客户端是远程的,那么标准的devise模式就是客户端使用一个远程接口来访问一个会话bean,然后这个会话bean就像一个联系实体bean一样。 会话bean通过本地接口与实体bean进行通信(从模式的angular度来看,这种技术称为会话外观,实际上它可以在远程或本地环境中使用)。

一个很好的理由是因为你通过它的接口访问EJB。 这样,当使用远程接口时,按值传递参数,并在使用本地接口时通过引用传递参数。 你知道这是为什么吗? 这是有道理的:也许你想要一个远程应用程序访问您的业务对象,因为通过引用减lessnetworking延迟。 请记住:远程访问涉及将对象转换为字节stream的过程 – 编组 – 将字节stream转换为对象的过程 – 解组。 这个额外的步骤 – 封送和解组 – 降低了应用程序的性能。