本文展示了样本 J2EE 应用程序的设计方法、实现和测试结果,提供了 EnterPRise java Bean 的本地和远程接口使用的基本比较。
引言
随着 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”。
构件和先决条件
接下来的部分将描述创建一个可灵活部署、多层、分布式 J2EE 应用程序(名为“Dual”)的开发和部署过程,这个应用程序将演示两种接口的使用。结果包括:
1.三个 J2EE 应用程序(EAR 模块),用于已描述的部署场景。
2.Java 模块,包含一个 Java Bean。
3.两个 J2EE EJB 模块:
·.无状态会话 EJB
·容器治理的实体 EJB(CMP)
4.J2EE Web 应用程序(WAR 模块),包含:
·一个 Servlet
·一个 jsp 页面
·一个 Html 页面
5.数据源(映射到 DB2 数据库)。
6.两个测试服务器,每个实现:
·WebSphere Test Environment(WTE)
·Tomcat Test Environment
这个应用程序采用标准的模型-视图-控制器(Model-View-Controller)体系结构(MVC,“Model 2”),其中,Servlet 用作控制器,而 JSP 用作表示组件。为了使事情更接近于现实生活,还使用了 Data Transfer Object(DTO)或 Value Object(VO)设计模式。Servlet DualServlet 与会话 Bean Dualsession 交互,而会话 Bean DualSession 又与实体 Bean DualEntity 交互。实体 Bean 与数据源(包括表 PERSON 在内)交互。VO 是由可序列化 Java 类 Person 表示的。该对象用作会话 Bean 的方法的返回值以及 JSP 页面的 Java Bean。
下载 Zip 文件包含完整的 EAR 模块和本文所用的代码清单。通过这些现成的解决方案,您可以简单地创建数据库表和服务器项目,然后轻松地运行、调试和测试应用程序。下载的内容还包括一个简单的 Java HTTP 多线程测试客户端来帮助进行性能测试。
在实际场景中,图 1 和 2 展示的每个组件都将驻留在分离的节点(机器)中。出于本文的目的,我们将把每个组件(包括持久性存储在内)放在同一机器中,在单个开发人员的工作台上运行每个组件。由于本配置只是出于教育的目的,它仍将不限定可灵活部署的应用程序的特征。应用程序的每个主要的组件都可以部署到分离的节点中而不用进行代码更改,采取的方式是将相对主机名提供给客户端、Web 和 EJB 组件以及 JDBC 驱动程序。
为了完成本文中的步骤,您必须在工作台上安装如下应用程序:
·DB2 V8.1(数据库)
·WebSphere Studio Application Developer Version 5.1(集成开发和测试环境)
·Tomcat 4.1.29(Servlet 容器);请在此下载。
下面几个部分将描述开发 Dual J2EE 应用程序的主要步骤。为了本练习的成功,必须完全遵循命名约定。