IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere | Open source  >

IBM WebSphere 开发者技术期刊: 利用 WebSphere Application Server Community Edition 中现有的 WebSphere Application Server J2EE 资源

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

Robert Peterson (rrpeters@us.ibm.com), WebSphere Enablement, Austin, TX, IBM
Kulvir Bhogal (kbhogal@us.ibm.com), WebSphere 软件服务,Fort Worth,TX, IBM

2006 年 4 月 13 日

通过访问 IBM® WebSphere® Application Server JNDI 树,WebSphere Application Server Community Edition(IBM 公司免费的、基于 Apache Geronimo 技术的轻量级 J2EE™ 应用服务器)几乎能够与其所拥有的任何 J2EE 资源进行交互,并且重用这些资源。

摘自 IBM WebSphere 开发者技术期刊

引言

企业常常利用其组织中各种不同的应用服务器来容纳多样化的业务对象。例如,某公司主要运行 IBM WebSphere Application Server V6,但是还有一项业务需要运行 IBM 免费的 WebSphere Application Server Community Edition,以支持企业中运行的各种 J2EE 应用程序。代码的可重用性是支持这种环境的重要编程原则,它能降低编程成本,并且利用现有的代码资产。

在本文中,我们将介绍如何在非 WebSphere Application Server 的 J2EE 应用服务器中利用 WebSphere Application Server V6 中运行的现有 J2EE 代码项目。具体而言,我们将介绍如何使用 WebSphere Application Server Community Edition(它是基于 Apache Geronimo 的 Apache Software Foundation 的 J2EE 服务器项目)来实现与 WebSphere Application Server V6 所支持的 J2EE 资源的交互。

本文假设您已拥有关于 WebSphere Application Server Community Edition 或者 Apache Geronimo 的基本知识,并且大致了解 J2EE 和 WebSphere Application Server 的编程概念。请参阅参考资料以获得有用的介绍信息。

在本文中:

  • Community Edition 指的是 WebSphere Application Server Community Edition。
  • WebSphere Application Server 指的是 WebSphere Application Server - Express、WebSphere Application Server Base 和 WebSphere Application Server Network Deployment。




回页首


跨应用服务器的场景

我们将说明如何通过 Community Edition 的 Servlet 容器中的 Servlet 来使用 J2EE 资源——特别是运行于 WebSphere Application Server EJB 容器中的无状态会话 EJB 组件。换句话说,如图 1 所示,Community Edition 上运行的消费 Servlet (consuming servlet) 用来访问 WebSphere Application Server V6 上运行的 EJB 组件。


图 1. 跨应用服务器示例的拓扑结构
图 1. 跨应用服务器示例的拓扑结构

先决条件

要按照本文中的步骤进行,必须已正确安装并运行下列软件:

  • Application Client for WebSphere Software ——也被称作“瘦客户端”,它是一组资源和特别为客户端访问 WebSphere Application Server 应用程序而设计的 IBM JVM。在任何 WebSphere Application Server 产品的安装向导或者 launchpad 向导中都可以找到它。也可以通过试用版下载来单独获得它。在安装应用程序客户端时,需要安装 J2EE 和 Java™ 瘦应用程序客户端,如图 2 所示。


    图 2. 安装应用程序客户端
    图 2. 安装应用程序客户端
  • WebSphere Application Server Community Edition v1.0.1.1 ——基于 Apache Geronimo 开源技术的轻量级 J2EE 应用服务器,它通过快速的下载和简单的实现来帮助加快开发和部署。您可以下载并免费使用 Community Edition 产品。

  • IBM Rational® Application Developer V6 ——这是我们将用来实现 Geronimo 和 WebSphere 代码的开发环境。请确保下载 WebSphere Application Server V6 的可选组件 Integrated Test Environment。Rational Application Developer 的试用版可供下载。
需要使用随 WebSphere Application Client V6 一起安装的 IBM JRE 来运行 WebSphere Application Server Community Edition。如果使用 Windows ®,请确保将 Community Edition 安装到不包含空格的目录中(比如,不能是 c:\Program Files)。

对于本文,上述所有的必备软件可以驻留于同一台物理计算机上。然而,在生产环境中,Community Edition 通常驻留于一台独立的计算机上(该计算机不属于实际的 WebSphere Application Server 集群),而不同于我们将在此处的方式(在 Rational Application Developer 中运行用于测试的 WebSphere Application Server 实例)。

尽管如此,WebSphere Application Client 必须与 Community Edition 安装在同一台计算机上,因为我们将从 WebSphere Application Client 中导入 JAR 文件作为 Community Edition 中的公共库。





回页首


为 WebSphere Application Server 创建一个简单 EJB 组件。

首先,使用 Rational Application Developer 创建一个简单的无状态会话 EJB,使之运行于 WebSphere Application Server 的 EJB 容器中。我们将使用 Rational Application Developer 测试环境来提供对该 EJB 的支持。由于要集中于调用 EJB 的远程公开方法的能力,而非 EJB 本身,所以我们有意让这个 EJB 尽可能简单。

  1. 在 Rational Application Developer 中创建一个新的工作区。可以通过选择 File => Switch Workspace... 来切换工作区,或者在开始运行的时候指定一个新的工作区。

  2. 在 J2EE 视图中,右键单击 EJB Projects 并选择 New => EJB Project

  3. 输入或选择下面的值(图 3):

    • 名称: SimpleEJBProject
    • EJB 版本: 2.1
    • 目标服务器:WebSphere Application Server v6.0
    • EAR 项目名称: SimpleEJBProjectEAR

    然后选择 Finish


    图 3. 新的 EJB 项目的定义
    图 3. 新的 EJB 项目的定义
  4. 展开 SimpleEJBProject => Deployment Descriptor: SimpleEJBProject。右键单击 Session Beans,然后选择 New => Session Bean


    图 4. 新的会话 Bean
    图 4. 新的会话 Bean
  5. 输入或选择下面的值(图 5):

    • Bean 的名称: SimpleEJB
    • 缺省包: devworks.example

    然后选择 Finish


    图 5. 创建会话 Bean 的向导
    图 5. 创建会话 Bean 的向导
  6. 选择 EJB Projects => SimpleEJBProject => Deployment Descriptor: SimpleEJBProject => Session Beans => SimpleEJB,然后单击 plus 图标来展开 SimpleEJB Bean。按如下所示修改远程接口类 (SimpleEJB):

    public String retrieveText() {
    	return "G-E-R-O-N-I-M-O!!!";
    }

    这样就完成了 SimpleEJB 项目的实现。现在我们需要导出 EJB 客户端 JAR 文件,其中包含了调用远程 EJB 的存根。在 Community Edition 上运行的消费应用程序 (consuming application) 将会使用到这个客户端 JAR 文件。

  7. 如果展开 Other Projects ,那么将会看到 SimpleEJBProjectClient。如果没有看到,可通过右键单击 SimpleEJBProject 然后选择 EJB Client JAR => Create EJB Client JAR Project 来创建一项。将新的客户端命名为 SimpleEJBProjectClient

  8. 右键单击 SimpleEJBProjectClient 然后选择 Export... => JAR file => Next。选择位置,并将该文件命名为 EJBClient.jar,将其保存到 JAR 文件下,然后单击 Finish

  9. 最后,我们需要将这个简单的 EJB 部署到 WebSphere Application Server。选择 Servers 选项卡,右键单击 WebSphere Application Server 然后选择 Start

  10. 右键单击 WebSphere Application Server ,选择 Add and Remove Projects => SimpleEJBProjectEar => Add ,然后单击 Finish

至此,我们已拥有了 J2EE 资源,一个无状态的会话 EJB 组件。我们要通过即将构建的消费 Servlet(运行于 Community Edition)来调用这个 EJB 组件的远程方法。使用 Universal Test Client 来测试 EJB。


图 6. Universal Test Client
图 6. Universal Test Client

在创建实现调用的 Servlet 之前,我们需要确定 J2EE 资源在 WebSphere Application Server JNDI 树中的位置。接下来将对此进行介绍。





回页首


为简单 EJB 确定一个完全限定的 JNDI 名称

要确定刚刚创建的 EJB 在 JNDI 树的位置,我们可以使用名为 dumpNameScript 的脚本工具。

定位到集成 WebSphere Application Server 的 bin 目录,并运行 dumpNamespace 脚本。比如,在 Windows 中,它可能是 C:\IBM\RAD6\runtimes\base_v6\bin\dumpNameSpace.bat,对于 Linux®,它可能是 /opt/IBM/RAD6/runtimes/base_v6/bin/dumpNameSpace.sh。


图 7. 初始名称空间
图 7. 初始名称空间

在实践中,当考虑到 WebSphere Application Server Network Deployment 中所管理的 JNDI 资源(比如我们的简单 EJB)时,有几种不同的选择: 单元、集群、节点和服务器级别。举例来说,如果有几个节点和集群成员,则推荐使用限定于单元或者集群级别的 JNDI 名称,以简化该资源工作负荷的管理。

在我们的例子中只有一个服务器,即集成测试服务器,因此我们将使用限定于服务器级别的最短的可用 JNDI 名称。从初始名称空间转储中,为服务器复制 JNDI 名称,不包含第一个正斜杠。在本例中,它是 nodes/localhostNode01/servers/server1。使用 -startAt 选项开关再次运行 dumpNameSpace。例如:

dumpNameSpace.sh -startAt nodes/localhostNode01/servers/server1


图 8. Server1 的名称空间
图 8. Server1 的名称空间

请注意这时 SimpleEJBHome 的 JNDI 名称变短了。图 8 中高亮显示的不包含第一个正斜杠的名称为 ejb/devworks/example/SimpleEJBHome,我们将使用它在 Community Edition 的 Servlet 代码中查找 WebSphere Application Server 资源。





回页首


创建 Community Edition Web 项目

现在我们准备构建运行于 Community Edition servlet 容器中的 Servlet。我们将使用 Rational Application Developer 来构建使用者 Servlet (consumer servlet)。

  1. 在 Rational Application Developer 中创建一个新的工作区。可以通过选择 File => Switch Workspace... 来切换工作区,也可以在开始运行的时候指定一个新的工作区。

  2. 在 Web 视图中,右键点击 Dynamic Web Projects,并选择New => Dynamic Web Project

  3. 为新项目输入或者选择下列值(图 9):

    • 名称: GeronimoWebApp
    • Servlet 版本: 2.4
    • 目标服务器: WebSphere Application Server v6.0 (我们实际上将部署到 Community Edition,但是在这里,这也是有效的取值。)
    • EAR 项目: GeronimoWebAppEAR

    然后选择 Finish


    图 9. 动态 Web 项目的定义
    图 9. 动态 Web 项目的定义

    要调用运行于 WebSphere Application Server 的远程 EJB,需要将我们在简单 EJB 项目中创建的 EJB client JAR 添加到 Servlet 的类路径中。在接下来的步骤中,我们将使用标准的 J2EE 规则(将实用 JAR 文件添加到 GeronimoWebApp Web Application Resource (WAR) 文件的 /WEB-INF/lib 目录)。

  4. 展开 Dynamic Web Projects => GeronimoWebApp => Web Content => WEB-INF ,然后右键单击 lib。选择 Import... => File System => Next

  5. Browse... SimpleEJB 的 EJB 客户端 JAR 目录,选择 EJBClient.jar,然后单击 Finish

  6. /WEB-INF/lib 目录应与图 10 所示类似。


图 10. Web 项目实用 JAR 文件
图 10. Web 项目实用 JAR 文件




回页首


创建 Servlet 来调用简单 EJB

我们现在准备开始编写消费 Servlet,它的工作是调用运行和部署于 WebSphere Application Server V6 上的 EJB。我们将再次使用 Rational Application Developer 向导来帮助进行代码的开发。

  1. 右键单击 Deployment Descriptor: GeronimoWebApp ,并选择 New => Servlet。将 Servlet 命名为 TestEJBServlet,然后单击 Next


    图 11. 创建一个新的 Servlet
    图 11. 创建一个新的 Servlet
  2. 对于 Java 包的名称,输入 devworks.example,然后单击 Next


    图 12. 指定包
    图 12. 指定包
  3. 取消选中 doPost,然后单击 Finish


    图13. 完成 Servlet
    图 13. 完成 Servlet
  4. 为 doGet 方法插入下面的代码:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws 
    ServletException, IOException {
    	String text = "";
    	final String jndiName = "ejb/devworks/example/SimpleEJBHome"; [A]
    	Properties env = new Properties();
    	env.setProperty(Context.PROVIDER_URL, "iiop://localhost:2809"); [B]
    	env.setProperty(Context.INITIAL_CONTEXT_FACTORY, 
    		"com.ibm.websphere.naming.WsnInitialContextFactory");
    	
    	try {
    		
    		InitialContext ctx = new InitialContext(env); [C]
    		Object obj = ctx.lookup(jndiName); [D]
    		SimpleEJBHome ejbHome =
    			(SimpleEJBHome) 
    			javax.rmi.PortableRemoteObject.narrow(obj, SimpleEJBHome.class); [E]
    		SimpleEJB myEJB = ejbHome.create(); [F]
    		
    		text = myEJB.retrieveText(); [G]
    		
    	} catch(NamingException ne) { [H]
    		System.err.println("TestEJBServlet failed to lookup SimpleEJBHome. JNDI 
    String="+jndiName);
    		ne.printStackTrace(System.err);
    		// Recovery strategy omitted (i.e. try again with a different host/port)
    	} catch(CreateException ce) {
    		System.err.println("TestEJBServlet failed to create SimpleEJB instance.");
    		ce.printStackTrace(System.err);
    		// Recovery strategy omitted (i.e. clear the JNDI resource cache on the 
    		// context factory and try again)
    	}
    	response.getWriter().println("Text from WebSphere Server: " + text); [I]
    					

    这里的说明为这段代码提供了详细的总结,用字母进行编号的步骤与示例代码中括号里的字母相对应。

    1. 这是用来定位 SimpleEJBHome 的远程管理对象的 JNDI 字符串。请注意,这是使用前面的 dumpnamespace 脚本所确定的 JNDI 字符串。
    2. 初始化 JNDI 上下文需要两个属性,服务器的 IIOP URL 和上下文工厂类。关于附加属性(比如关闭缺省的查找缓存),请参阅 WebSphere Application Server Information Center。
    3. 使用这些属性来创建初始上下文。
    4. 我们的远程管理对象,SimpleEJBHome 接口,是使用 JNDI 名称检索得到的。
    5. 必须将对象缩小转换(实际上是远程引用的转换)为 SimpleEJBHome 接口。
    6. SimpleEJB 实例是从 EJB Home 接口创建的。
    7. 调用 retrieveText() 远程方法,其结果绑定于字符串变量 text。
    8. 远程调用要求捕获 NamingException 和 CreateException 两类异常。在实际的企业应用程序中,要考虑这两种异常的子类,并且仔细地处理它们。(为了本文的目的,这个例子必须简明。)
    9. 字符串 text 的内容被输出到浏览器。
  5. 作为最后一项任务,我们必须导出将部署到 Geronimo 上的 WAR。右键单击 GeronimoWebApp 并选择 Export... => War file

  6. 将新文件命名为 GeronimoWebApp.war





回页首


为 Community Edition 部署创建部署计划。

在将 WAR 文件部署到 Community Edition 之前,我们必须创建部署计划。为此,创建一个以下面代码为内容的名为 geronimo-jetty.xml 的文件。

<web-app xmlns="http://geronimo.apache.org/xml/ns/web/jetty"
   configId="/devworks10/geronimo/testejb">
    <dependency>
        <uri>upload/jars/naming.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/wsexception.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/ras.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/bootstrap.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/emf.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/namingclient.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/ecutils.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/iwsorb.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/idl.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/ffdc.jar</uri>
    </dependency>
    <dependency>
        <uri>upload/jars/stubs.jar</uri>
    </dependency>
    <context-root>/testejb</context-root>
    <context-priority-classloader>false</context-priority-classloader>
</web-app>

这个 XML文件便是一个部署计划。这段代码中:

  • Configid 是在 Community Edition 管理控制台中出现的唯一的应用程序名称。
  • Context-root 和 J2EE 应用程序 EAR 部署描述符中的 Context-root 相同。在从 Web 浏览器中访问 Servlet 时,我们将使用这个 Context-root。
  • classloader 属性设置为 False,这样一来,就不会提高该应用程序的类加载器行为的优先权(这是缺省的设置)。
  • 尤其要注意 dependency 标签。每个标签都引用了我们将作为公共库进行添加的 WebSphere Application Client JAR 文件,当我们的 TestEJBServlet 访问 WebSphere Application Server 实例时,Community Edition 将需要用到这些 JAR 文件。




回页首


将 WebSphere Application Client JAR 作为公共库添加到 Community Edition。

如前所述,Community Edition 需要某些 WebSphere Application Client 安装内容中的 JAR 作为公共库添加到其运行环境中。它们的作用是简化 Community Edition 环境和 WebSphere Application Server EJB 容器间的通信。要添加这些公共库,我们需要启动 Community Edition 并且使用它的管理控制台:

  1. 启动 Community Edition。对于 Windows,请选择 Start => All Programs => IBM WebSphere => Application Server Community Edition => Start the Server。对于 Linux/UNIX®,请执行 Community Edition 安装路径的 bin 目录中的 startup.sh 。比如在本例中,它位于: /opt/IBM/WASCE/bin/startup.sh

  2. 打开 Web 浏览器并定位到 http://localhost:8080/console/,以打开 Community Edition 管理控制台。

  3. 在用户名处输入 system,并在密码处输入 manager

  4. 要添加公共库,转到 Community Edition 管理控制台,并选择 Services =>Common Libaries

  5. 使用 Add File to Repository 工具来从 WebSphere Application Client 安装目录的 lib 文件夹添加下列文件。(这些 JAR 文件被添加到上传目录中,这正是我们前面所创建的部署计划引用 <dependency> 标签下文件的原因。)

    • bootstrap.jar
    • ecutils.jar
    • emf.jar
    • ffdc.jar
    • idl.jar
    • iwsorb.jar
    • naming.jar
    • namingclient.jar
    • ras.jar
    • stubs.jar
    • wsexception.jar

图 14. 存储库查看器
图 14. 存储库查看器




回页首


将 WAR 文件部署到 Community Edition

现在我们可以将 WAR 文件部署到 Community Edition:

  1. 在 Applications 中,选择 All Configurations

  2. 使用页面中 Install New Applications 部分(图 15)来浏览我们前面创建的 GeronimoWebApp.war(存档) 和 geronimo-jetty.xml(计划)文件。


    图 15. 安装 Web 应用程序
    图 15. 安装 Web 应用程序
  3. 应用程序应该自动启动。请确保集成 WebSphere Application Server 已经启动。

  4. 要对跨服务器场景进行测试,我们将测试 Geronimo Servlet 调用 WebSphere Application Server 远程公开 EJB 方法的能力。只需在 Community Edition 计算机上运行浏览器中打开这个地址:http://localhost:8080/testejb/TestEJBServlet。


    图 16. TestEJBServlet 输出
    图 16. TestEJBServlet 输出
  5. 应该可以看到与图 16 所示类似的响应,这正是我们的 WebSphere Application Server EJB 实体的作用。





回页首


回顾我们的方法

不仅适用于 EJB!

尽管本文展示的是如何访问 EJB 组件,但是并没有限制可以从第三方应用服务器访问哪些类型的 J2EE 资源。例如,甚至可以从外部访问 JDBC 数据源对象。需要遵循的核心概念是如何通过第三方应用服务器访问 WebSphere Application Server 的 JNDI 树。此后,便几乎可以与 JNDI 树中的任何资源进行交互。

为什么不使用 Web 服务?

为什么使用这个方法,而不使用 Web 服务来将相关的两个应用服务器连接在一起呢? 在这个方法中,我们使用 Java 来与 Java 进行对话。因此,当我们可以避免 SOAP 的序列化/反序列化的开销而进行容器间的对话时,就没有必要承担 Web 服务的性能负担。而且,不能假设总是可以访问正在运行 J2EE 资源的 WebSphere 容器并通过它来封装资源,比如将 EJB 作为 Web 服务。

有关集群的考虑事项

如本文所述,某个组织可能会发现,通过第三方应用服务器来使用其 J2EE 资源(比如 WebSphere Application Server 中的 Enterprise JavaBean)是比较有利的。然而,如果要在产品中使用这种方式,对于 WebSphere Application Server 中需要访问的目标 J2EE 资源的高可用性方面,需要特别关注。应访问 WebSphere Application Server 的消费应用程序服务器上的应用程序,而不应该访问应用服务器集群的某个特定实例。如前所述,应该为目标资源使用一个限定于单元或集群级别的 JNDI 名称,来简化该资源工作负荷的管理。





回页首


结束语

本文展示了对于希望在任何非 WebSphere 的应用服务器(也可能运行于其数据中心)中利用 WebSphere Application Server 的 J2EE 资源的组织,应该如何访问 WebSphere Application Server 容器中包含的 J2EE 资源。具体而言,我们介绍了如何启用 WebSphere Application Server Community Edition(基于 Apache Geronimo 的IBM J2EE 应用服务器)来访问运行于 WebSphere Application Server 的 J2EE 资源。



参考资料

学习

获得产品和技术


作者简介

Author photo

Robert R. Peterson 是 IBM 软件服务部 WebSphere Enablement Team 的成员。他的工作是确保 WebSphere 系列产品能为 IBM 的客户带来尽可能大的价值。Robert 是一名颇有成就的发明家,也是 WebSphere Application Server V6: Performance and Scalability 的作者之一。他是著名的 IBM 天才孵化计划的前成员之一,拥有佛罗里达大学的计算机工程硕士学位。


Kulvir Bhogal 的照片

Kulvir Singh Bhogal 是 IBM 的一名顾问,在全美国的客户站点上设计和实现以 Java 为中心的解决方案。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款