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

developerWorks 中国  >  SOA and Web services | WebSphere  >

利用 WebSphere Process Server v6.2.0.1 中的 JAX-WS 绑定传递 SOAP 消息附件

developerWorks
文档选项

未显示需要 JavaScript 的文档选项

样例代码


级别: 初级

张 延钊, 高级软件工程师, IBM
戴 磊磊, 高级工程师, IBM
陈 玮峰, 软件工程师, IBM

2009 年 8 月 20 日

WebSphere Process Server v6.2.0.1 的一个重要新增功能就是对非引用 SOAP 消息附件(Unreferenced attachments in SOAP messages)的支持。本文结合一个应用场景介绍如何用 WebSphere Integration Developer(WID)V6.2.0.1 开发支持非引用 SOAP 消息附件的应用程序以及如何在 WebSphere Process Server V6.2.0.1 运行时环境中运行该应用。

前言

Web 服务是目前 SOA 实现中的关键技术之一。新版本的 WebSphere Process Server (WPS) v6.2.0.1 在支持原有 JAX-WS 绑定的基础上,增加了对未被引用(unreferenced)SOAP 消息附件的支持,如下图 1 所示。


图 1. SOAP 消息附件转换
图 1. SOAP 消息附件转换

WPS 运行时的 JAX-WS Web 服务绑定能够捕获 SOAP 消息附件并将之附加到 SMO(Service Message Object)中的附件部分,该附件可以随着 SMO 在 SCA 模块内的中介组件(Mediation Flow Component)间传递和处理。

本文将通过一个端到端的应用场景,向您讲述如何在实际的应用中利用该功能。通过本文,您将了解到以下相关内容:

  • 如何将一个具有业务逻辑的 Java 类发布为 Web 服务。
  • 如何建立 Web 服务的客户端。
  • SCA 模块与 Web 服务实现端及其客户端的交互。
  • SCA 模块与 Web 服务实现端及其客户端交互过程中如何添加 SOAP 消息附件。




回页首


第一部分:端到端应用场景概述

下图 2 是本文用来说明 JAX-WS 绑定传递 SOAP 消息附件功能的一个端到端应用场景,箭头所指的方向是 SOAP 消息附件的流转方向,调用接口为双向的接口。在本场景中,读者也可以在下图 2 的 SCA 模块中定义中介流组件(Mediation Flow Component)以实现更复杂的处理逻辑。


图 2. 端到端应用场景逻辑图
图 2. 端到端应用场景逻辑图

下面我们针对图中的结构来进行一个简单的说明:

  • Web 服务的客户端发出调用请求,产生 SOAP 消息,方向如图箭头 1 所示。
  • SOAP 消息流转到客户端的 SOAP 消息句柄,被处理(加载附件)之后流转到具有 Web 服务绑定的导出组件,如图 2 箭头 2 所示。
  • 在 WPS SCA 模块里面因为具有 JAX-WS Web 服务绑定的导出组件和导入组件是直连方式,那么附件也会包含在导入组件调用 Web 服务时的 SOAP 消息中,如图 2 箭头 3 所示。
  • 在导入组件调用 Web 服务的时候,Web 服务端的 SOAP 消息句柄会截获 SOAP 消息并查看附件,然后再进入 Web 服务,如图 2 箭头 4 所示。
  • 因为是双向的接口,Web 服务会返回响应的 SOAP 消息,Web 服务端 SOAP 消息句柄会将响应的 SOAP 消息获取并查看附件,如图 2 箭头 5 所示。
  • 响应 SOAP 消息经过 SOAP 消息句柄处理后返回给具有 Web 服务绑定的导入组件,如图 2 箭头 6 所示。
  • 在 WPS SCA 模块里面具有 Web 服务绑定的导出组件会将响应返回给客户端,如图 2 箭头 7 所示。
  • 响应 SOAP 消息经过 Web 服务客户端 SOAP 消息句柄处理(查看附件)后返回到 Web 服务的客户端,如图 2 箭头 8 所示。

下面章节将向您阐述如何使用 WebSphere Integration Developer(WID)v6.2.0.1 创建上述的应用场景。我们首先创建一个 Web 服务,其次是一个基于 WPS 的 SCA 模块,该 SCA 模块将调用上述 Web 服务,最后创建 Web 服务客户端,该客户端通过 SCA 模块和 Web 服务交互。





回页首


第二部分:Web 服务的实现

在这一部分中,我们将首先使用 WID v6.2.0.1 来创建一个 java 类,其中定义方法 operation1, 该方法中实现了一个简单的打印信息业务功能,之后我们会向读者展示如何利用 WID 提供的向导工具方便的将上述 java 类实现的功能发布为 Web 服务。

创建具有业务功能的 Java 类

首先用 WID 建立一个动态的 Web 工程。从 WID 的主菜单依次点选 文件->新建->其他->Web->动态 Web 工程。如下图 3 所示:


图 3. 创建动态 Web 工程
图 3. 创建动态 Web 工程

参数如图 3 中所示,点击 完成

接下来建立 Java 业务功能类及其使用的数据成员类。从新建的动态 Web 工程“WebService”右键选取新建 ->,如下图 4。


图 4. 创建 Java 类
图 4. 创建 Java 类

业务功能类为 WebService.java,方法为 opration1。数据成员类为 DataBO,有两个字符串类型的数据成员 testID 和 result。

创建 Web 服务

构建 Web 服务可以使用两种方式:自顶向下和自底向上。自顶向下方式指通过一个 WSDL 文件来创建 Web 服务,自底向上是从 Java 类出发创建 Web 服务。本文使用的是自底向上的方式。

选中 Java 业务功能类,右键选择 Web 服务->创建 Web 服务 便可以轻松的通过 WID 开发工具提供的向导来创建一个 Web 服务,见下图 5。


图 5. 创建 Web 服务向导 1
图 5. 创建 Web 服务向导 1

选择使用 JAX-WS 方式,点击 下一步


图 6. 创建 Web 服务向导 2
图 6. 创建 Web 服务向导 2

选择使用 SOAP 1.2 方式,默认会生成 WSDL 文件。忽略提示并点击 完成。如果 WID 具有通用测试环境(UTE),将会自动检测出服务器的端口号并将 Web 服务发布到服务器上。

下面我们看一下 Web 服务的向导为我们建立的一些文件:


图 7. Web 服务的文件
图 7. Web 服务的文件

WebServiceDelegate.java 是 Web 服务的实现类。WebServiceService.WSDL 文件是根据业务逻辑类生成的 Web 服务描述语言文件,在 SCA 模块中可以直接使用它作为接口文件。 WebServiceService_Schema1.xsd 是 WSDL 文件中引用数据的文件,在 SCA 模块中可以使用它作为业务对象文件。在建立动态 Web 工程 WebService 的时候 WID 工具会自动建立 EAR 工程 WebServiceEAR。导出 WebServiceEAR.ear 文件后您可以手工部署到 WPS 服务器上。这样一个 Web 服务便被创建并发布到服务器上了。





回页首


第三部分:SCA 模块的实现

上一部分讲述了如何创建一个 Web 服务。这个部分将讲述在 SCA 模块中如何利用 Web 服务绑定来调用该服务。

首先建立一个 SCA 的模块库。点击 文件->新建-> ,命名为 WSlib。把 WebServiceService.WSDL 和 WebServiceService_Schema1.xsd 文件直接拷贝到该库,如下图 8 所示。


图 8. SCA 模块的库
图 8. SCA 模块的库

然后建立一个 SCA 模块。点击 文件->新建->模块 ,命名为 WSModule。选择 WSlib 为它的库,如下图 9 所示。


图 9. 创建 SCA 模块
图 9. 创建 SCA 模块

在自动打开的 SCA 模块编辑板中拖入导入和导出组件,并添加接口 WebServiceDelegate,如下图 10 所示。


图 10. 添加导入导出组件
图 10. 添加导入导出组件

右键单击导入组件选择 产生绑定->Web 服务绑定。浏览选择已存在的 Web 服务端口,选择传输方式。其默认值为 SOAP1.2/Http, 如下图 11 所示。


图 11. 建立导入组件的 Web 服务绑定
图 11. 建立导入组件的 Web 服务绑定

右键单击导出组件选择 产生绑定->Web 服务绑定。选择传输方式,其默认值为 SOAP1.2/Http, 如下图 12 所示:


图 12. 建立导出组件的 Web 服务绑定
图 12. 建立导出组件的 Web 服务绑定

在产生导出组件 Web 服务绑定时,WID 会自动产生一个 WSDL 文件 WSModule_Export1.wsdl 在库 WSlib 中。

切换到 WID 的物理资源视图模式。查看这个 WSDL 文件及其使用的 Web 服务端口,如下图 13 所示


图 13. Web 服务端口
图 13. Web 服务端口

SCA 模块已经建立完成。当此 SCA 模块部署到 WPS 服务器的时候,它的表现形式是一个 Web 服务。





回页首


第四部分:Web 服务客户端的创建

上一部分中具有 Web 服务绑定的 SCA 模块发布到 WPS 服务器后,对外的表现形式是一个 Web 服务。本部分的 Web 服务客户端用来调用这个 Web 服务。

首先创建一个动态的 Web 工程,命名为 WSClientWeb。选择 WSModuleApp 为其 EAR 工程。然后在业务集成视图右键点击库 WSlib 的 Web 服务端口 Export1_WebServiceDelegateHttpPort,选择 新建->web 服务->产生客户端。Web 服务运行方式为 JAX-WS。客户端工程为 WSClientWeb。如下图 14 所示。


图 14. Web 服务客户端向导
图 14. Web 服务客户端向导

点击 完成 后向导会生成一些 Java 类文件。这些 Java 类文件将在 Web 服务客户端中使用。


图 15. 客户端 Java 类
图 15. 客户端 Java 类

接下来创建 JSP 来作为调用 Web 服务的客户端。右键点击动态 Web 工程 WSClientWeb,选择 新建->JSP。加入调用代码如下:


清单 1. JSP 中的调用代码
				 
   try { 
		 WebServiceDelegate sei = (new Export1WebServiceDelegateHttpService()) 
				 .getExport1WebServiceDelegateHttpPort(); 
		 DataBO input1 = new DataBO(); 
		 input1.setResult("false"); 
		 input1.setTestId("swaTest001"); 

		 DataBO output1 = sei.operation1(input1); 
		 out.println("The Result is :" + output1.getResult()); 
	 } catch (java.lang.Exception e) { 
		 e.printStackTrace(); 
	 } 

Web 服务的客户端已经创建完成。目前为止应用程序的三个部分 Web 服务客户端,SCA 模块,Web 服务实现端已经可以部署到 WPS 服务器上运行。那么怎样把附件添加到 Web 服务调用过程中的 SOAP 消息中呢?接下来的部分将向您讲述。





回页首


第五部分:SOAP 消息附件与 SOAP 消息句柄的实现

WPS v6.2.0.1 中的 JAX-WS 绑定目前支持的 SOAP 消息附件类型是未被引用的(unreference)附件。SOAP 消息主体里面的数据对象中没有包含附件的任何引用信息。

在消息传递过程中,依靠 SOAP 消息句柄将 SOAP 消息进行捕获,然后将附件加载到 SOAP 消息的末尾。SOAP 消息句柄分为两种,逻辑处理和协议处理。本文选用协议处理。

下面对 Web 服务的客户端和服务器端的 SOAP 消息句柄分别进行实现

Web 服务客户端 SOAP 消息句柄的实现

SOAP 消息句柄主要是实现 SOAPHandler 接口。

首先右键点击 WSClientWeb 工程,选择 新建->。如下图 16 所示:


图 16. 建立 SOAP 消息句柄
图 16. 建立 SOAP 消息句柄

在新建的 ClientSOAPHandlser 类里面 handleMessage 方法是对 SOAP 消息的处理方法。该方法实现将附件 attachement001.xml 文件加载到 SOAP 消息中。代码如下:


清单 2. SOAP 消息处理程序代码
 
public boolean handleMessage(SOAPMessageContext arg0) { 
    Boolean outboundProperty = (Boolean) arg0 
         .get(MessageContext.MESSAGE_OUTBOUND_PROPERTY); 
    if (outboundProperty.booleanValue()) { 
      System.out.println("Into the ClientSOAPHandler outbound."); 
      MessageContext requestContext = (MessageContext) arg0; 
      Map attachments = (Map) requestContext 
           .get(MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS); 
      if (attachments == null) { 
        attachments = new HashMap(); 
        requestContext.put(
        MessageContext.OUTBOUND_MESSAGE_ATTACHMENTS,attachments); 
                               } 
        try { 
          URL base = this.getClass().getResource(""); 
          String attchPath = new File(base.getFile(), "../../../"
             + "attachment001.xml").getCanonicalPath(); 
          DataHandler dh = new DataHandler(new FileDataSource(attchPath)); 
          attachments.put("Attachment001", dh); 
             } catch (Exception ex) { 
           System.out.println
           ("*****Adding attachment has exception!!!*****"); 
           ex.printStackTrace(); 
			                         } 
          System.out.println("Attachment sending..."); 
     } else { 
        System.out.println("Into the ClientSOAPHandler inbound."); 
        SOAPMessage sm = arg0.getMessage(); 
        Iterator attachments1 = sm.getAttachments(); 
        while(attachments1.hasNext()){ 
         AttachmentPart attachment1 = 
            (AttachmentPart) attachments1.next(); 
         System.out.println("The attachment ContentId:"
            + attachment1.getContentId()); 
             } 
        System.out.println("Test Finished!"); 
         } 
         return true; 
   } 

上面 SOAP 消息句柄代码中的 outbound 是指发出请求,inbound 是接受响应。

SOAP 消息句柄已经建成,接下来需要将该 SOAP 消息句柄加入到 Web 服务绑定的消息处理链中。在 Web 服务客户端 index.jsp 中添加如下代码:


清单 3. 添加 SOAP 消息句柄代码
				 
BindingProvider bp = (BindingProvider) sei; 
Binding bd = bp.getBinding(); 
List HandlerChain = bd.getHandlerChain(); 
ClientSOAPHandler handler = new ClientSOAPHandler(); 
HandlerChain.add(handler); 

添加完上述代码后,SOAP 消息句柄会在接口调用的时候自动发挥作用。Web 服务客户端和其 SOAP 消息句柄已经完成。

Web 服务实现端的 SOAP 消息处理程序的实现

Web 服务实现端的 SOAP 消息句柄与客户端是类似的(请注意 inbound 和 outbound 与请求和响应的关系)。Web 服务实现端采用 XML 描述文件来声明使用 SOAP 消息句柄。

首先创建 SOAP 消息句柄类 ServiceSOAPHandler。然后针对该类创建它的 XML 描述文件。MyHandler.xml 文件如下:


清单 4. SOAP 消息句柄的 XML 描述文件
				 
<?xml version="1.0" encoding="UTF-8"?>        
<handler-chains xmlns="http://java.sun.com/xml/ns/javaee"> 
  <handler-chain> 
    <handler> 
        <handler-class>service.ServiceSOAPHandler</handler-class> 
    </handler> 
  </handler-chain> 
</handler-chains> 

最后在 Web 服务实现类 WebServiceDelegate.java 的注释中加入该 XML 文件的信息给消息处理链。


清单 5. 添加 SOAP 消息句柄
				 
 @javax.jws.HandlerChain(file="../service/Myhandler.xml") 

Web 服务实现端及其 SOAP 消息句柄创建完成。虽然 Web 服务实现端和客户端加载 SOAP 消息句柄的方式不同,但作用是相同的。





回页首


第六部分:程序的运行

如果 WID 已经具有通用测试环境(UTE),可以将两个 EAR 工程直接发布到 WPS 服务器上运行。也可以手工从 WID 导出应用程序的 ear 文件,然后安装到 WPS 服务器上。运行时使用浏览器访问如下地址:http://<hostname>:<port>/WSClientWeb/index.jsp 。运行结果如下:


清单 6. 运行结果
				 
 SystemOut    1 Into the ClientSOAPHandler outbound.  
 SystemOut    2 Attachment sending...                 
 SystemOut    3 Into the ServiceSOAPHandler inbound.  
 SystemOut    4 The attachment ContentId:Attachment001 
 SystemOut    5 Into the Web Service.                 
 SystemOut    6 The test id is :swaTest001            
 SystemOut    7 Into the ServiceSOAPHandler outbound. 
 SystemOut    8 Into the ClientSOAPHandler inbound.   
 SystemOut    9 Test Finished!                        

从以上打印的信息中我们不难看出:附件“attachement001.xml”在客户端的 SOAP 消息句柄被加载到 SOAP 消息末尾(清单 6 中的 1 和 2 行)。附件被 Web 服务端的 SOAP 消息句柄捕获,SOAP 消息句柄打印出该附件的内容 ID “Attachment001”(清单 6 中的 3 和 4 行)。之后响应被返回客户端(清单 6 中 7 和 8 行)。





回页首


第七部分:Web 服务绑定的扩展

本文的示例中对于 SOAP 消息附件的处理操作是在 Web 服务实现端和客户端。在 SCA 模块中是否也可以进行 SOAP 消息附件的处理操作?答案是肯定的。

首先在 SCA 模块中提前创建好 SOAP 消息句柄。然后在导入 / 导出组件的属性窗口中添加该句柄。如下图 17:


图 17. 在导出组件添加 SOAP 消息句柄
图 17. 在导出组件添加 SOAP 消息句柄

除此之外 SCA 模块中也可以采用中介流组件(Mediation Flow Component)中的自定义元语,用来操作服务消息对象(SMO)的附件信息。请看如下代码:


清单 7. 服务消息对象中获取附件代码
				 
 java.util.List attachmentsList = (java.util.List)smo.getList("attachments"); 





回页首


结束语

本文围绕 WPS v6.2.0.1 的新功能—— JAX-WS 绑定对 SOAP 消息附件的支持向您讲述了 Web 服务和 SOAP 消息附件处理等一系列相关的知识,希望对您今后的实践有所帮助。更多的信息请读者参考文章后面的参考资料加深理解。






回页首


下载

描述名字大小下载方法
本文代码示例WebServiceSwA_PI.zip88 kBHTTP
关于下载方法的信息


参考资料

学习

获得产品和技术
  • 下载 IBM 产品评估版 ,并开始使用来自 DB2、Lotus、Rational、Tivoli 和 WebSphere® 的应用程序开发工具和中间件产品。



作者简介

张延钊毕业于西北工业大学,获得计算机软件硕士学位,毕业后加入 IBM 中国研发中心,是 PMI 认证的 PMP ,目前负责 WebSphere 流程服务器运行时移植的系统测试工作。


戴磊磊是 IBM 中国研发中心的软件工程师。自 2006 年起一直在 IBM 从事软件测试的工作,对 Websphere 流程服务器 WPS 和 WebSphere Integration Developer 具有丰富的实践经验。


陈玮峰,是 IBM 中国研发中心的工程师,从事过多个产品的开发和测试工作,目前从事 WebSphere 流程服务器产品的系统测试工作。




对本文的评价








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