灵活使用EJB的本地和远程接口(一)2011-04-23引言随着 EJB 2.0 规范的出现,Enterprise Java Bean 可以有本地接口、远程接口,或同时有两种接口,这给 J2EE 开发人员和架构师提供了非常大的灵活性。实现两种接口给予 Bean 客户端和 Bean 本身在开发场景方面的自由。取决于客户端与 EJB 的相对位置,可以设置访问 Bean 的逻辑的最佳方式。本地接口提供对 EJB 的优化访问(如果客户端和 Bean 位于同一 Java 虚拟机(Java Virtual Machine,JVM)中),而远程接口可以用于分布式体系结构。在单个应用程序中组合这两种类型的接口来支持两种访问 Bean 的方式有助于减少设计约束。通过使某些事情具体化来权衡设计决策的利弊是非常有意义的,这样的事情可以是测试结果、案例研究,最好是方法和工具而不要仅仅是请求和响应。本文力图提供更多的关于使用 EJB 的本地和远程接口的信息(基于样本 J2EE 应用程序)。通过使用 WebSphere Studio Application Developer 的开发和测试环境,我们将实现两种 J2EE 应用程序体系结构的拓扑,运行应用程序,并且借助于简单的 Java HTTP 客户端对应用程序进行测试来获取与性能有关的反应和数据以供考虑。J2EE 应用程序的体系结构选择一般来说,最简单的拓扑是 J2EE 应用程序中的每个组成部分都在同一 WebSphere Application Server、同一 JVM、同一节点或机器中。在这样的情况下,WebSphere Application Server 提供 Servlet 容器和 EJB 容器(图 1)。这种遍及全文的拓扑(我们将省略防火墙、负载平衡器和转换器等等)称为“All-in-One”拓扑。

图 1. 简单的 J2EE 应用程序拓扑:All-in-One这是 WebSphere Studio Application Developer Version 5.1(以下称为 Application Developer)中的 WebSphere Test Environment(WTE)的缺省拓扑。然而,这样的拓扑可以作为站点体系结构的一部分成功地用于生产环境。随着 EJB 2.0 规范的出现,可以使用 J2EE 应用程序的任何 Java 组件中本地接口来与同一 EJB 容器中的 EJB 进行通信。有时,需要分离 Servlet 和 EJB 容器,比如出于应用程序安全性考虑。应用程序架构师或开发人员可以选择把 Servlet 容器放在不同的节点上,因而使 J2EE 应用程序拓扑更加复杂(如图 2 所示),我们称这种拓扑为“分离容器(Separate Containers)”拓扑。事实上,WebSphere Application Server 可以用作高效 Servlet 容器和 EJB 容器,但是为了使事情更容易区分,我们在此包含了 Tomcat Application Server 和 Servlet 容器。

图 2. 拓扑:分离容器(Separate Containers)在分离容器(Separate Containers)拓扑中,J2EE 应用程序的 Web 部件与 EJB 通信的惟一方法是通过远程接口(一般是通过 Internet Inter-Orb Protocol(IIOP))。(在本文中,我们不讨论 Web 或 HTTP 服务器的分离,因为它不是我们关注的要点)。部署体系结构的决策在 J2EE 应用程序的开发过程中发生改变。因此,开发人员可能想利用 EJB 的远程和本地接口的优势来避免损失灵活性。有可能开发一种 J2EE 应用程序,它将适应任何合理的部署拓扑而不用更改一行源代码,惟一需要进行的更改也许就是部署描述符设置,这可以大大节省开发人员的时间。比较本地接口与远程接口的使用性能也是非常有意义的。稍后,我们将创建一个样本 J2EE 应用程序,它将使我们能够通过设置 EJB 的环境参数来方便地从使用本地接口转换到使用远程接口。对于 All-in-One 拓扑,我们将通过控制方式使用本地或远程接口来测试样本应用程序,并且分别称它们为“All-in-One-All-Local”和“All-in-One-All-Remote”。