分享

WebSphere JAX

 yespon 2016-10-31

在 IBM Bluemix 云平台上开发并部署您的下一个应用。

开始您的试用

引言

JAX-RPC 即 Java API for XML RPC。它是用于在 Java 2 Enterprise Edition (J2EE) 环境中调用 Web 服务的可互操作标准 API。WebSphere 6.x JAX-RPC 1.1 实现通过 WSDL 扩展支持多种协议(SOAP/HTTP、SOAP/JMS 和 RMI/IIOP)。可以在调用期间以编程方式选择所需的端口(协议绑定),或者指定能够使用 WebSphere 管理控制进行外部配置的缺省端口。还可以指定能够覆盖 WSDL 文件中的值的 Web 服务目标地址。

了解服务使用者和服务提供者

在理想的 SOA 环境中,服务使用者和服务提供者使用企业服务总线(Enterprise Service Bus,ESB)连接。ESB 使用弹性 SOA 所需的标准或自定义中间件来提供服务位置透明性、协议转换和一系列其他功能。在现实中,获得具有完全部署 ESB 环境的理想 SOA 需要花费很多时间。随着越来越多的企业开始踏上自己的 SOA 之旅,应用程序可以在没有配备全功能 ESB 的情况下利用一些 ESB 功能,并能够在企业中完全部署 ESB 和 SOA 环境后方便地迁移到 ESB 环境。

图 1 显示了服务使用者和服务提供者的分离情况。本文将说明如何利用 WebSphere JAX-RPC 实现调用和使用 WebSphere 中的多协议支持来使用三个协议公开服务:HTTP、Java? Messaging Service (JMS) 和 Remote Method Invocation - Internet Inter-ORB Protocol (RMI/IIOP) (EJB)。我们假定服务使用者和服务提供者是 WebSphere J2EE 应用程序,因此在 WebSphere 容器中运行。WebSphere 管理配置用于实现对服务使用者的服务位置和协议透明性。通过这样,就可以将服务使用者绑定到所需的服务提供者实例。另外,还支持在不用更改服务调用代码的情况下选择所需的协议。当然,此技术能够提供的功能也有限制。这仅仅在某些情况下才能工作,包括不需要中介功能时、在开发与测试环境中。甚至有时可以用于生产环境中,在这种情况下,特定服务的使用者需要绑定到部署前预先确定的服务提供者的特定版本上。

注意:在其他一些场景中,服务使用者可以为独立 J2EE 应用程序客户机、Java 应用程序或 .NET 之类的其他平台的客户机。本文将不会对这些情况进行讨论。此类场景要求使用能够提供位置和协议透明性的 Web 服务网关或全功能 ESB 解决方案。

图 1. 服务使用者与服务提供者的分离
服务使用者与服务提供者的分离

回页首

了解 JAX-RPC

JAX-RPC 表示用于基于 XML 的远程过程调用(Remote Procedure Call,RPC)的 Java API。它使用基于 XML 的协议 SOAP 1.1 规范来在分布式环境中交换信息。JAX-RPC 设计用于在 Java 和非 Java 平台之间进行互操作,基于 WS 基本概要 1.0 技术,如 XML、SOAP 1.1 和 WSDL 1.1。JAX-RPC 提供同步和异步单向调用。

有关 JAX-RPC 的更多信息,请参见以下两篇 developerWorks 文章:

注意:JAX-WS 2.0 是经过更新的 API 规范。它解决了 JAX-RPC 的一些不足之处,而且还支持其他异步调用模式。JAX-WS 2.0 使用了不同的包名称。不过,可以继续在 J2EE 环境中使用 JAX-RPC。事实上,J2EE 1.4 强制要求使用 JAX-RPC 1.1 实现。

回页首

JAX-RPC 客户机类型介绍

JAX-RPC 支持三种类型的客户机,这些客户机各自调用目标服务的方法不同,如图 2 中所示。

  • 静态存根使用开发期间创建的存根。它们在运行时不需要 WSDL 的副本。服务端点地址硬编码在客户机中,或从属性文件读取并在运行时设置。到特定端口的绑定也在开发期间事先确定。
  • 动态代理在运行时创建代理,从而可灵活绑定到特定端口和端点。通过这样,可以实现位置和协议透明性,因此是本文讨论的重点。WebSphere 实现提供了配置参数,可以用于将端点和端口(协议)决策外部化到客户机程序外。
  • 动态调用接口(Dynamic Invocation Interface,DII)是最不常用的客户机类型,主要用于 WSDL 频繁变化的情况。

有关 JAX-RPC 客户机类型的更多细节,请参见参考资料部分列出的 IBM Redbooks?。

图 2. JAX-RPC 客户机类型
JAX-RPC 客户机类型

回页首

调用多协议 Web 服务

WebSphere JAX-RPC 多协议实现允许在使用公用编程模型 (JAX-RPC) 时通过一系列协议(如 SOAP/HTTP、SOAP/JMS 和 RMI/IIIOP)调用 Web 服务。通过使用 SOAP/JMS 和 RMI/IIOP 进行调用,可在某些情况下提高性能,还能提供高服务质量(Quality of Service,QoS)功能,如:

  • SOAP/JMS
    • 提供可靠的消息交付
    • 提供广播支持和请求的排队模型
  • RMI-IIOP
    • 提供同步通信和可靠请求交付
    • 提供安全性和事务上下文传递支持

回页首

示例演示程序介绍

本文提供了一个非常简单的示例应用程序来演示此概念。该应用程序中包含使用多个协议(即 HTTP、JMS 和 RMI/IIOP)的 Enterprise Java Bean (EJB)。本文将说明如何编写调用此服务的简单客户机。其调用代码仅处理 Web 服务接口,并不考虑用于与服务提供者进行通信的实际协议。服务使用者与服务提供者之间的管道连接在部署时使用 WebSphere 管理控制台完成。这个后期绑定可提供更改绑定和所需协议的灵活性,而这正是本文中所述的一项主要优势。

本文使用动态代理调用 (Dynamic Proxy Invocation) 方法,如图 2 中所示。我们将使用 WebSphere Application Server Toolkit (ASTK)) 6.1 集成开发环境(Integrated Development Environment,IDE)说明创建服务和服务调用者的步骤。还可以使用类似的 IDE,如 Rational Application Developer (RAD) 和 Rational Application Software Architect (RSA)。该示例应用程序以项目交换 zip 文件的形式提供,以便导入 ASTK 6.1 或其他基于 Eclipse 的 IDE。请将开发好的示例应用程序部署到 WebSphere Version 6.1。示例应用程序在 WebSphere 6.0 和更高版本中均能正常工作。

回页首

开发示例服务提供者应用程序

完成以下步骤:

  1. 打开 WebSphere ASTK 6.1。
  2. 使用 Create an EJB project 向导创建新项目。
  3. 提供 EJB Project name 并单击 Next。按照 J2EE 最佳实践,创建 EJB 客户机 JAR 文件并指定客户机 JAR 文件名称,如图 3、4 和 5 中所示。
    图 3. EJB project 向导
    EJB project 向导
    图 4. EJB project
    EJB project
    图 5. EJB 客户机 jar
    EJB 客户机 jar
  4. 右键单击刚刚创建的 EJB 项目并选择 New
  5. 单击 Other,并选择 Enterprise Bean creation 向导。
    图 6. Enterprise Bean
    图 6. Enterprise Bean
  6. 在 Enterprise bean creation 向导中选择 Session bean。
  7. 指定所创建的 EJB 项目。
  8. 指定 EJB name 和 default package,如图 6 中所示。
  9. 指定 Enterprise Bean Details,如图 7 中所示。请确保选择创建 EJB 服务端点的复选框。将服务端点命名为 MyEJB_SEI。
    图 7. Enterprise bean details
    Enterprise bean details
  10. 单击 Finish,以创建 Enterprise Java Bean。请注意图 8 中的 MyEJBBean 类在 ejbModule 文件夹中创建。另外,还要注意 MyEJBServiceProjectClient 项目在 Other Projects 中创建。我们将在 EJB Bean 方法中添加一个方法并将其提升为位于 MyEJBServiceProjectClient 中的接口类。
    图 8. EJB 文件详细信息
    EJB 文件详细信息
  11. 在 EJB Bean 类 MyEJBBean 中添加一个方法,如图 10 中所示。
    图 9. MyEJBBean 方法 Java 代码
    MyEJBBean 方法 Java 代码
  12. 在 Java 编辑器中右键单击企业 Bean 方法,以便将此方法提升为远程 EJB 接口和服务端点接口(Service Endpoint Interface,SEI)对象。请在上下文菜单中单击 Enterprise Bean > Promote to Remote Interface and Enterprise > Promote to Service Endpoint Interface,从而完成此工作。提升后的方法如图 10 中所示。
    图 10. 进行了方法提升后的 EJB 客户机接口
    进行了方法提升后的 EJB 客户机接口
  13. 公开服务端点接口并创建 Web 服务描述语言(Web Service Description Language,WSDL)文件,以描述作为客户机存根生成依据的接口。创建能够使用多个协议公开接口的 WSDL 文件:HTTP、JMS 和 RMI/IIOP。目前 IDE 并不支持 RMI/IIOP 绑定,不过可以采用手动方式将其插入。使用 WebSphere 6.0 提供的 Java2WSDL 创建 WSDL 文件。为了从 EJB 创建 WSDL 文件,请使用 EJB jar 文件和客户机 jar 文件。将其从 ASTK 工作区导出到临时目录。

    注意:目前在 ASTK 6.1.1 和 RAD 7.0 中提供了用于生成 HTTP、JMS 和 EJB 绑定的工具。如果使用这些新的 IDE 增强工具,则可以从步骤 14 跳到步骤 30,从开发示例服务客户机应用程序继续。

  14. 导出 EJB 客户机 Jar,如图 11 中所示。
    图 11. 导出 EJB 客户机 Jar
    导出 EJB 客户机 Jar
  15. 导出 EJB Jar 文件,如图 12 中所示。
    图 12. 导出 EJB Jar
    导出 EJB Jar
  16. 在命令行窗口中从 WebSphere 安装或 RAD/RSA 6.0 WebSphere 运行时环境中转到 WebSphere 运行时目录。
  17. 确保 WebSphere 运行时环境的 bin 目录在您的路径中,以便命令行窗口能找到 Java2WSDL.bat
  18. 转到 bin 目录,并运行 setupcmdline.bat
  19. 将目录更改到临时工作目录,并相应地设置 CLASSPATH,以便 Java2WSDL 目录在类路径中找到 EJB 和客户机 Jar 文件。
  20. 设置 CLASSPATH=MyEJBServiceProject.jar;MyEJBServiceProjectClient.jar;%CLASSPATH%
  21. 按照以下所示运行 Java2WSDL 命令:
    java2wsdl -bindingTypes http,jms,ejb -style
        document-implClass testservice.MyEJBBean testservice.MyEJB_SEI
  22. 忽略警告消息。稍后将对生成的 WSDL 文件进行编辑,修复绑定位置。图 13 中显示了命令的示例屏幕截图。
    图 13. Java2WSDL
    Java2WSDL
  23. 检查之前的命令所生成的 WSDL 文件。请注意在图 14 中有三个绑定:SOAP (HTTP)、EJB (RMI/IIOP) 和 JMS。向下滚动到文件底部,会发现各个绑定对应的三个端口。另外,每个端口的地址均未定义。我们将稍后对此进行定义。
    图 14. WSDL 文件:绑定
    WSDL 文件:绑定
    图 15. WSDL 文件:端口
    WSDL 文件:端口
  24. 将生成的 WSDL 导入到 ASTK IDE 工作区的 MyEJBServiceProject 中,如图 16 和 17 所示。
    图 16. 导入 WSDL 文件
    导入 WSDL 文件

    图 17. 已导入的 WSDL 文件
    已导入的 WSDL 文件
  25. 运行用于生成其他 XML 文件的 WSDL2Java 命令。将生成描述 Web 服务的 webservices.xml 和 IBM WebSphere 容器特定的绑定文件 (ibm-*.xml)。
  26. 从临时目录运行以下命令:
    WSDL2Java -verbose -role develop-server -container
    ejb-genJava no MyEJB_SEI.wsdl

    生成的文件位于 META-INF 目录中,如图 18 中所示。
    图 18. Web 服务 XML 文件
    Web 服务 XML 文件
  27. 按照图 19 和 20 中所示,将生成的文件导入 EJB 项目的 META-INF 目录中。
    图 19. 导入 Web 服务 XML 文件
    导入 Web 服务 XML 文件
    图 20. 导入 Web 服务 XML 文件的相关详细信息
    导入 Web 服务 XML 文件的相关详细信息

    现在 EJB 项目已启用 Web 服务。通过仔细分析 webservice.xml 文件,会发现需要使用 EJB 名称更新 <ejb-link> 标记,如图 21 中所示。


    图 21. Web 服务 XML 文件
    Web 服务 XML 文件
  28. 将 <ejb-link> 标记的值更改为 MyEJB,即在 ejb-jar.xml 文件中定义的 EJB 名称。可以在 XML 编辑器中打开 webservices.xml 文件来编辑此值。

    为了使用 HTTP 和 JMS 访问 EJB 服务,需要启用相应的端点。通过创建位于 EJB 前的特殊 HTTP 路由器启用 HTTP 端点。而 JMS 端点则是通过在 EJB 前创建消息驱动的 Bean 来启用的。EJB 绑定使用普通 RMI/IIOP 查询进程来查找 Bean 和对 Bean 调用相应的方法。三个协议调用流如图 22 中所示。

    图 22. 多协议
    多协议

    为了启用 SOAP/HTTP 和 SOAP/JMS 的对应端点,请使用 IDE 中提供的工具。

  29. 在 META-INF 文件夹中右键单击 EJB 项目的 webservices.xml 文件,并选择 Web Services > Create Router Modules。
  30. 选择传输 HTTP 和 JMS。向导将填充其他字段的内容,如图 23 中所示。
    图 23. 端点启用
    端点启用

    这将创建 Web 项目和 EJB MDB 项目,如图 24 中所示。您需要创建队列目的地,并定义 JCA 激活规范,以启用在安装示例应用程序时将看到的消息驱动 Bean。

    图 24. 路由器项目
    路由器项目

回页首

开发示例服务客户机应用程序

在此部分,我们将开发在 WebSphere Web 容器中运行的简单 Web 客户机应用程序。此客户机应用程序调用我们在前面开发的 Web 服务。将使用动态调用代理 方法来调用 Web 服务。

调用时,将不会显式地指定用于通信的任何端口,而将获取与 Web 服务关联的缺省端口。将在 WebSphere 管理控制台中配置缺省端口。

  1. 在 ASTK IDE 中创建 Dynamic Web Project,如图 25 中所示。
    图 25. 创建 Dynamic Web Project
    创建 Dynamic Web Project
  2. 将此 Web 项目命名为 MyEJBServiceWebClient,并在接下来两个屏幕选择缺省设置,如图 26 中所示。
    图 26. MyEJBServiceWebClient
    MyEJBServiceWebClient
  3. 创建对之前创建的 Web 服务的引用。在 MyEJBServiceWebClient 项目中,导航到 Web.xml 文件(如图 27 中所示),并双击打开 Web 部署描述符编辑器。
    图 27. web.xml——Web 部署描述符文件
    web.xml
  4. 选择 Reference 选项卡(如图 28 中所示)并单击 Add
    图 28. 创建服务引用
    创建服务引用
  5. 选择 Service Reference 单选按钮,并单击 Next。如图 29 中所示,对话框将列出 IDE 工作区中可用的所有 Web 服务。其中列出了在前面创建的 MyEJB_SEI.wsdl 文件。
    图 29. 生成的 Web 服务引用文件
    Web 服务引用文件
  6. 选择 WSDL 文件并单击 Finish。这将导入 WSDL 文件,并将在 Web 项目的 src 目录中创建接口文件和相关联的存根文件,如图 29 中所示。

开发 Web 服务客户机绑定

需要告知 Web 部署描述符此客户机中引用的 Web 服务。

  1. 在 Web 服务描述符编辑器中单击 WS Binding 选项卡,如图 30 中所示。
    图 30. WS binding
    WS binding
  2. 单击 Add。将列出项目中的 Web 服务引用。
  3. 选择 service/MyEJB_SEIService,如图 31 中所示,并单击 OK。
    图 31. 选择服务引用
    选择服务引用
  4. 指定 WSDL 文件的位置。请注意,此时并不需要定义 WSDL 中的端点 URL 信息。事实上,如果查看 WSDL 文件,会发现未定义端口的位置地址。将在部署服务客户机应用程序后使用管理控制台为每个端口定义端点。
  5. 从 WS Binding 选项卡的 Service Reference Details 下浏览器到项目的 WSDL 文件所在位置,然后选择 WSDL 文件 MyEJB_SEI.wsdl,如图 32 中所示。
    图 32. Service reference details——WSDL 文件位置
    Service reference details——WSDL 文件位置

    定义端口限定名称绑定。有三个端口定义:HTTP、JMS 和 EJB 中的每个协议对应一个端口定义。

  6. 在 Port Qualified Name Binding 部分单击 Add。这将打开一个对话窗口,可在其中指定命名空间和端口名称。在 RAD/RSA 6.0 中,将自动填充这些信息。在 ASTK 6.1 中需要手动输入。
  7. 添加以下条目,如图 33 中所示。
    图 33. 端口限定名称绑定
    端口限定名称绑定

这就完成了 Web 服务客户机绑定定义。

创建 Servlet

接下来,创建 Servlet 来调用服务。Web 应用程序具有单个 JSP,提供了多个 Servlet URL 链接,用于传递参数,从而以不同的方式调用 Web 服务。

  1. 使用 Servlet creation 向导创建 Servlet 类 WebServiceInvoker,并将其命名为 Invoker
    图 34. Invoker Servlet
    Invoker Servlet

    请记住,您的 Web 服务公开使用三个不同机制的接口:HTTP、JMS 和 EJB (RMI/IIOP)。这些在 WSDL 文件中由三个不同的端口指定:MyEJB_SEI、MyEJB_SEIEjb 和 MyEJB_SEIJMS。使用 JAX-RPC 获取对服务的引用时,请使用 getPort() 方法。

  2. 直接指定服务接口类,或使用附加的参数(即所需端口的完全限定名称)调用该方法。请注意,如果未指定端口名称,可以在 WebSphere 管理控制台定义首选端口。我们将在示例服务客户机应用程序安装期间了解如何定义此项。请参见图 35 中的两个调用样式。
    图 35. getPort() 方法
    getPort() 方法

    Servlet 代码的其余部分非常简单。可以采用四种不同的方法之一调用 Servlet。每个调用都在 index.jsp 中作为链接提供。第一个链接在不指定完全限定端口名称的情况下检索 Web 服务引用,如图 35 中所示。将哪个端口用于 Web 服务取决于在 WebSphere 管理控制台中的首选端口配置。其他三个链接指定传递给 getPort() 方法调用的所需端口名称。

    图 36. Servlet 方法
    Servlet 方法
  3. 添加 doGet() 方法,此方法直接调用 doPost() 方法。
  4. 创建 doPost() 和其他三个方法,如图 37 到图 40 中所示。
    图 37. doPost() 方法
    doPost() 方法
    图 38. locateServiceMethod 方法
    locateServiceMethod 方法
    图 39. invokeViaJAXRPCDynamicProxy 方法
    invokeViaJAXRPCDynamicProxy 方法
    图 40. invokeViaJAXRPCDynamicProxyWithQualifiedPortName 方法
    invokeViaJAXRPCDynamicProxyWithQualifiedPortName 方法

    此项目还使用实用工具项目 MiscUtils,其中包含 HtmUtils 类,该类提供将响应输出到 Servlet 请求的实用方法。这可能并不遵循 Servlet 和 JSP 开发中的最佳实践,但此处的目的是为了说明如何进行 JAX-RPC 服务调用。有关本文的示例代码,请参见下载部分。

  5. 将 index.jsp 包括进来。index.jsp 的源代码和预览如图 41 中所示。
    图 41. index.jsp
    index.jsp
    图 42. index.jsp 预览
    index.jsp 预览
  6. 创建 Enterprise Application Archive 项目,并将 Web 客户机项目和 MiscUtils 项目添加到 EAR 中,如图 43 中所示。
    图 43. Web 客户机 EAR
    Web 客户机 EAR
  7. 确保 MiscUtils.jar 文件包括在 MyEJBServiceWebClient 项目的类路径中。
  8. 右键单击 MyEJBServiceWebClient 项目并选择 Under J2EE Module Dependencies。确保选中了 MiscUtils.jar,如图 44 中所示。
    图 44. J2EE module dependencies
    属性

现在可以将服务提供者和服务客户机应用程序部署到 WebSphere Application Server 上了。请注意,对于此示例,我们将服务提供者和客户机部署到相同的应用服务器上。但在实际中,可能会将应用程序部署到不同的应用服务器上。

对于此示例,将首先部署服务提供者应用程序。部署之后,获取包含将在客户机部署期间使用的端点信息的 WSDL 文件。我们将使用 WebSphere Application Server 6.1。

回页首

为示例服务提供者应用程序配置资源

在将示例服务提供者应用程序部署到 WebSphere Application Server 前,请创建数个资源。按照以下所示步骤,使用 WebSphere 管理控制台创建资源。由于您的 Web 服务还接受使用 JMS 的请求,因此需要创建一个总线、两个用于传入和应答的队列目的地和一个用于消息驱动 Bean(Message Driven Bean,MDB)的激活规范。

创建总线

  1. 从管理控制台选中 Service Integration > Buses,并单击 New。
  2. 为总线提供名称,如图 45 中所示。
    图 45. 创建总线
    创建总线
  3. 单击 Next > Finish > Save。
  4. 导航回总线,并将 server1 作为总线成员添加到总线,如图 46 中所示。
    图 46. 将 server1 作为成员添加到总线
    添加总线成员

会缺省启动总线安全性。这要求启用应用程序安全性和创建 J2C 身份验证别名等。对于此示例,请导航到 MyBus 资源并单击 Security,以禁用总线安全性。

图 47. 总线安全性
总线安全性

回页首

创建队列目的地

接下来,在总线上创建用于传入 SOAP 请求的队列目的地 MyEJBServiceQDestination。导航到 Service integration > Buses > Destinations,然后单击 New 并按照说明相应地进行操作,从而创建队列目的地。这样将得到图 48 中所示的目的地。

图 48. 队列目的地
队列目的地

创建队列连接工厂

在创建队列前,需要创建队列连接工厂,请按照以下步骤进行操作:

  1. 导航到 Resources > Queue connection factories,选择服务器范围,并单击 New。
  2. 选择 Default messaging provider。
  3. 填写其他输入字段,如图 49 中所示。
    图 49. MyQueueQCF——队列连接工厂
    MyQueueQCF——队列连接工厂
  4. 单击 OK 和 Save。请注意,MDB 使用资源引用名称 jms/WebServicesReplyQCF,该名称可以映射到相同的队列连接工厂。

创建队列

接下来,创建映射到已经创建的队列目的地的队列。按照图 50 中所示提供输入。请注意请求队列的 JNDI 名称。此名称用于在 WSDL 文件中标识使用 SOAP/JMS 的端口的端点 URL。

图 50. MyEJBServiceQ——服务请求队列
MyEJBServiceQ——服务请求队列

创建激活规范

接下来,创建激活规范,以将 MDB 连接到队列目的地。在 WebSphere 管理控制台中,导航到 Resources > Activation specification。为激活规范所使用的 JNDI 名称为 MyEJBServiceProject_ActivationSpecJNDIName。可以从在 JMS 路由器项目中创建的 MDB 的 EJB 部署描述符检查此设置。确保此处使用了相同的 JNDI 名称。创建激活规范时使用的值如图 51 中所示。

图 51. 激活规范
激活规范

复查配置

以上进行了大量的配置工作。接下来我们将回顾一下到目前为止已经创建的所有资源。已创建的所有资源如图 52 中所示。

图 52. 配置回顾
配置回顾

回页首

安装示例服务提供者应用程序

使用 WebSphere 管理控制台安装应用程序。

  1. 将 MyEJBServiceProjectEAR 企业归档导出到临时工作目录。
  2. 在 WebSphere 管理控制台中导航到 Applications > Install New Applications,并指向所导出的 EAR 文件。
  3. 选中相应的复选框,以部署 Web 服务,如图 53 中所示。这一点在安装应用程序时非常重要。
    图 53. 选中部署 Web 服务对应的复选框
    选中部署 Web 服务对应的复选框
  4. 单击 Next,以选择部署使用的服务器。下一个屏幕要求将 jms/WebServicesReplyQCF 资源引用映射到队列连接工厂,如图 54 中所示。可以使用与服务请求的队列目的地相同的队列连接工厂 (jms/MyQueueQCF)。
    图 54. 映射 WebServicesReplyQCF
    映射 WebServicesReplyQCF
  5. 单击 Next,并将安装保存到主存储库。
  6. 定义 EJB 和 JMS 端点 URL 信息。请导航到 Enterprise Applications > MyEJBServiceProjectEAR >Provide JMS and EJB endpoint URL information 并在表输入信息(如图 55 中所示),从而完成此定义工作。EJB URL Fragment 为 jndiProviderURL=corbaloc:iiop:<hostname>:2809。JMS URL Fragment 为 jms:/queue?destination=jms/MyEJBServiceQ&connectionFactory=jms/MyQueueQCF
    图 55. EJB 和 JMS URL 端点定义
    EJB 和 JMS URL 端点定义
  7. 单击 OK 和 Save。导航回 Enterprise Application。在应用程序页面上有一个 Publish WSDL 链接,如图 58 中所示。
    图 56. Publish WSDL 屏幕
    Publish WSDL 屏幕
  8. 使用 Publish WSDL 链接获取将包含所有绑定端点的 Web 服务应用程序的 WSDL 文件。WSDL 文件以 zip 格式提供。打开 zip 文件,以检查将包括此 Web 服务应用程序的活动端点的 WSDL。此文件通常用于确定在服务客户机安装期间需要配置的端点。请参见图 57 中的 WSDL 文件,其中显示了前面定义的片段 URL 对应的完整 URL。请注意,Publish WSDL 显示了两个 WSDL 文件,其中一个以 Extended 作为后缀。这个扩展 WSDL 文件中包括 EJB 绑定。
    图 57. 端点 URL
    端点 URL
  9. 从 WebSphere 管理控制台启动应用程序。建议在此时重新启动服务器,因为服务器上有新创建的资源。
  10. 对 HTTP 路由器 URL 执行 Ping 操作,以确定在服务器和应用程序启动后 Web 服务是否处于活动状态。键入 URL,并确定其是否使用图 58 中所示的页面进行响应。
    图 58. 对 Web 服务进行 Ping 操作
    对 Web 服务进行 Ping 操作

至此已经完成了服务提供者应用程序的部署工作。接下来可以开始安装客户机应用程序了。

回页首

安装示例服务客户机应用程序

  1. 将客户机应用程序 MyEJBServiceWebClientEAR 导出到临时工作目录。
  2. 在 WebSphere 管理控制台中,导航到 Applications > Install New Application,选择导出的 EAR 进行安装,并单击 Next。请注意,我们此处将客户机部署到同一个服务器上。在实际中,可能会使用不同的服务器。
  3. 接受这个简单安装中的缺省设置。
  4. 单击 Next,然后单击 Finish,从而完成服务客户机应用程序安装。

回页首

配置服务位置透明性

  1. 请在安装后配置 Web 服务客户机绑定,从而为目标服务指定正确的端点 URL 地址。请记住,目前您的 WSDL 具有一个未定义的位置地址。可以从部署服务提供者应用程序后检索到的 Publish WSDL 文件获得目标服务端点地址,如图 59 中所示。
    图 59. Web 服务客户机绑定
    Web 服务客户机绑定
  2. 导航到已安装的应用程序。
  3. 单击应用程序链接,并单击 Manage Modules。
  4. 单击 Web 模块,并单击 Web services properties 下的 Web services client bindings,如图 59 中所示。
  5. 单击 Port Information 下的 Edit。这将打开 WSDL 中的三个端口。可以在此处为每个端口定义实际的端点 URL 地址,如图 60 中所示。这是一个很好的方法,可通过其将目标服务端点 URL 信息从客户机应用程序外部化。如果目标服务地址变更,可以很容易地将客户机应用程序指向新的服务端点。这个外部配置为您的客户机应用程序提供了位置透明性。
    图 60. 位置透明性
    位置透明性
  6. 启动应用程序,并键入以下 URL 来访问 Web 服务客户机 Web 应用程序: http://<hostname>:9080/MyEJBServiceWebClient
  7. 单击链接 3 和 4,以使用不同的端口名称测试服务调用;每个端口名称都使用不同的协议。单击链接 1 会使用缺省端口,可能会选择其中的某个协议。要确保使用所需的端口协议,请在 WebSphere 管理控制台的 Web services client binding configuration 中配置首选端口。我们将在接下来的内容中对此进行讨论。

回页首

配置协议透明性

  1. 在 WebSphere 管理控制台中导航到 Web 服务客户机应用程序的 Web service client bindings 页。
  2. 在 Preferred Port Mapping 下单击 Edit,如图 61 中所示。
    图 61. 协议(端口)透明性
    协议(端口)透明性
    图中显示了所引用的 Web 服务,并使用下拉列表列出 Web 服务可用的端口。
  3. 选择所需的端口,并单击 Apply。
  4. 保存更改,并重新启动 Web 客户机应用程序。
  5. 访问 Web 客户机应用程序,并使用第一个链接调用 Web 服务。您会注意到,将使用所选择的端口进行调用。这一点可以通过随调用消息输出的服务类名称得到验证。

示例应用程序演示到此结束。

回页首

使用 WebSphere ESB 和 WebSphere Service Registry and Repository 完成位置和协议透明性

位置和传输透明性属于这两个产品的内置功能的一部分。使用 WebSphere ESB 和 WebSphere Service Registry and Repository (WSRR) 是实现透明性的首选机制。WebSphere ESB 产品的 Version 6.0.2 提供了一个 WSRR 中介原语来在运行时查找目标服务提供者的端点地址。可以使用自定义中介原语来覆盖此端点。此外,管理员可以使用管理工具更改此端点。有关更多细节,请参见参考资料部分。

WebSphere ESB 是 IBM 提供的领先企业服务 (Enterprise Service Bus) 产品。它提供了位置、协议和一系列中介功能。通过使用 WebSphere ESB,可以方便地将本文中所述的技术迁移到更为可靠的 SOA 环境。

回页首

总结

本文讨论了如何使用 JAX-RPC 编程模型通过后期绑定和位置透明性将服务提供者从服务客户机使用者分离开。另外还讨论了 WebSphere JAX-RPC 实现的多协议支持,从而为服务实现提供额外的服务质量。我们开发并部署了一个示例应用程序来说明协议和服务位置透明性。通过使用服务总线,可以方便地将所演示的技术迁移到更为可靠的 SOA 实现中。

回页首

致谢

作者要感谢 Greg Flurry (IBM SOA Advanced Technology) 百忙之中抽出时间为本文提供了宝贵的反馈信息。

回页首

下载

描述名字大小
Service provider application for WebSphere 6.1myejbserviceproject.ear56KB
Service client application EAR for WebSphere 6.1myejbservicewebclient.ear35KB
Project interchange file including source codesamplejaxrpc.zip48KB

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多