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

时间:2009-09-06 13:48:08

标签: java-ee ejb ejb-3.0

我想知道为什么我们需要为EJB 3.0会话bean提供单独的远程和本地接口。我猜大多数时候他们都会定义相同的合同。为什么我不能有一个通用接口,在我的Bean中我应该只能说我希望远程和/或本地访问这个bean。

感谢 维卡斯

6 个答案:

答案 0 :(得分:15)

这是EJB规范所说的:

本地和远程编程模型之间的选择是Bean Provider在开发企业bean时所做的设计决策。
虽然可以为企业bean提供远程客户端视图和本地客户端视图,但更典型的是仅提供一个或另一个

JSR220 Chapter 3

因此,在编写bean时,请考虑谁是客户端,本地客户端不太可能需要相同的方法,甚至不需要远程客户端的相同bean。

答案 1 :(得分:12)

我不同意在设计时,远程和本地应该被视为简单的互换。

首先,远程调用存在开销,因此在设计远程接口时,需要仔细考虑是否正确的粒度和参数大小。因此提醒这将是相对昂贵的作为设计师是有帮助的。

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

答案 2 :(得分:8)

“位置透明度”的概念是一种危险的反模式。您的设计绝对需要知道它是在进行本地呼叫还是远程呼叫,原因有很多(错误处理和性能最明显)。

远程EJB接口与本地对等接口不同,因为异常签名需要不同,以适应只能在远程调用上发生的与网络相关的错误。将远程处理行李缠绕到Local接口(如EJB 1中的情况)会使代码变得非常糟糕。 EJB 2引入了单独的本地接口,以简化对始终本地的EJB的编程。

答案 3 :(得分:2)

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

  1. 使用方法定义您的Local接口。
  2. 让您的远程接口为空但扩展本地接口
  3. 拥有Local
  4. 中的所有实际业务逻辑和其他实现
  5. 让您的远程bean实现只委托给本地bean实现
  6. 这种方法可能是实现@Local& amp; @Remote到同一个界面。如果需要,可以在本地访问相同的方法,如果需要,可以远程访问,但不会产生任何性能开销。

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

答案 4 :(得分:2)

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

 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:

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

客户端类型 - 除非您总是希望客户端是Web组件或其他bean,否则请选择远程访问。

bean是紧密耦合还是松散耦合 - 如果bean彼此依赖并经常交互,请考虑本地访问。

可伸缩性 - 远程访问具有固有的可扩展性,如果可伸缩性是一个重要因素,则应该使用它。      随着EJB 2.0规范中本地接口的出现,大多数消息来源都建议实体bean几乎总是应该基于本地访问。使用本地接口,大多数有关细粒度数据访问的性能问题都会消失。如果客户端是远程的,则标准设计模式使客户端使用远程接口来访问会话bean,然后会话bean充当实体bean的联络人。会话bean通过本地接口与实体bean通信(从模式的角度来看,这种技术称为SessionFaçade,它实际上可以在远程或本地上下文中使用。)

答案 5 :(得分:1)

一个很好的理由是因为您通过其接口访问EJB。这样,在使用远程接口时通过值传递参数,在使用本地接口时通过引用传递参数。你知道为什么会这样吗?它是有道理的:也许您确实希望远程应用程序访问您的业务对象,因为通过引用传递可以减少网络延迟。请记住:远程访问涉及将对象转换为字节流的过程 - 编组 - 以及将字节流转换为对象的过程 - 解组。这个额外的步骤 - 编组和解组 - 会降低应用程序的性能。