在 WebSphere Process Server V7 中实现 web 服务事务

学习如何使用一个业务流程和外部 web 服务实现一个 Web Services Atomic Transaction 场景

本教程将指导您在一个 IBM® WebSphere® Process Server V7 业务流程和 WebSphere Application Server V7 上运行的一个外部 web 服务之间实现一个事务。本教程将讲解开发业务流程模块和 web 服务时在 IBM WebSphere Integration Developer V7 中执行的步骤,并说明如何配置 WebSphere Process Server 和 WebSphere Application Server 来启用 Web Services Atomic Transaction。本教程下半部分演示事务提交和回滚场景。

Rajiv Madassery, 软件开发人员, IBM

Rajiv Madassery 的照片Rajiv Madassery 是 India Software labs (ISL) 的 WebSphere Process Server Level 2 Support 团队的首席软件工程师。Rajiv 于 2003 年加入 IBM,曾经在 WebSphere Business Integration Adapters Functional Verification Test 团队和 WebSphere Application Server Level 2 Support 团队工作。



2011 年 3 月 14 日

简介

WebSphere Application Server(下面称为 Application Server)中的 Web Services Atomic Transaction (WS-AT) 支持允许 web 服务应用程序参与事务。借助这种支持,WebSphere Process Server(下面称为 Process Server)中运行的业务流程应用程序就能够参与分布式事务。

要进一步了解 web 服务事务支持,请参阅 信息中心

关于本教程

本教程旨在演示一个基于 WS-AT 的分布式事务,这个事务发生在 WebSphere Process Server 上运行的一个业务流程和一个基于 Java™ API for XML web services (JAX-WS) 的服务(驻留在一个外部 WebSphere Application Server 上)之间。本教程是此前的一篇文章 在 WebSphere Process Server 中以事务处理的方式将 Web 服务与 BPEL 流程集成 的继续。那篇文章针对 Version 6.0.2 of WebSphere Process Server。本文的重点是 Version 7.0 中的 WS-AT 配置。

本教程开发了两个应用程序:一个名为 “ABCBPEL” 的业务流程应用程序,包含一个业务流程和一个 web 服务导入;一个名为 “ABCService” 的 web 服务应用程序,如图 1 所示。ABCBPEL 模块中的业务流程组件调用 ABCService 中的 web 服务。ABCService 接收一个来自业务流程的参数,并将其作为数据将一行插入到数据库中。业务流程也有一个代码段组件,您可以用它来引发一个故障并演示一个全局事务回滚。

本教程提供了一个样例 Project Interchange 文件 WS-ATProjectInterchange.zip 供您下载。

图 1. WS-AT 上下文
WS-AT 上下文

本教程分为以下几节:

先决条件

您将需要:

  • 在 WebSphere Integration Developer 中开发的经验
  • WebSphere Process Server 和 WebSphere Application Server 的基本管理知识

系统要求

  • Microsoft® Windows® XP Professional Desktop,至少 2GB RAM
  • IBM WebSphere Integration Developer V7.0.0.2,带有 WebSphere Process Server Test Environment V7.0.0.2 和 WebSphere Application Server V7.0.0.9
  • 数据库服务器,比如 IBM DB2® Express

时间

大约 1 至 2 小时


准备应用程序开发设置

要在成员应用程序中建立 WS-AT,需要将 WS-Transaction 应用程序策略组同时附加到 web 服务提供者和 web 服务客户端应用程序。策略组简化了策略的配置,因为配置由服务质量实施。WS-Transaction 策略组在附加到应用程序后支持 WS-AT。要了解更多信息,请参阅信息中心主题:web 服务策略组

WS-Transaction 策略组默认提供。开发应用程序之前的第一步是从应用程序服务器导出一个策略组副本。我们将在开发应用程序时将这个策略组副本附加到应用程序,在应用程序部署后将其附加到相应的应用程序服务器。

导出 WS-Transaction 策略组

在这个场景使用的一个应用程序服务器中,执行以下步骤导出 WS-Transaction 策略组:

  1. 从管理控制台导航到 Services > Policy sets > Application policy sets or Services > Policy sets > System policy sets > Application policy sets,如图 2 所示。
    图 2. 应用程序策略组
    应用程序策略组
  2. 在 Application policy sets 面板中,选择并导出 WS-Transaction。默认情况下,WS-Transaction 策略组没有显示。选择 New… 按钮将 WS-Transaction 策略组添加到默认列表。见图 3。
    图 3. 添加 WS-Transaction 策略组
    添加 WS-Transaction 策略组
  3. 选择 WS-Transaction 策略组并单击 Export… 按钮。
  4. Export policy set archive file 页面中,定位策略组存档文件并单击下载文件,如图 4 所示。
    图 4. 导出策略组
    导出策略组
  5. 选择 File > Import > Web services > WebSphere Policy Sets(图 5)将策略组导入到 WebSphere Integration Developer(下面称为 Integration Developer)。
    图 5. 导入策略组
    导入策略组
  6. 将存档文件导入 Integration Developer。
  7. 需要重新启动 Integration Developer 才能读取策略组。

部署 web 服务应用程序

web 服务应用程序将从业务流程接收一个字符串参数,然后向数据库表发出一条插入命令。

开发 ABCService web 服务应用程序所需的步骤如下:

  1. 在 Integration Developer 中创建一个新应用程序:选择 Import > New > Java EE > Enterprise Application Project 并将其命名为 ABCService
  2. 向应用程序添加一个新的 Java 类并将其命名为 ABCService。参见图 6。
    图 6. 工作空间中的 ABCService 应用程序
    工作空间中的 ABCService 应用程序
  3. 将清单 1 中的代码粘贴到 ABCService.java
    清单 1. ABCService.java
    package com.ibm.test;
    import java.sql.Connection;
    import java.sql.Statement;
    import javax.naming.InitialContext;
    import javax.sql.DataSource;
    
    publicclass ABCService {
    	public String callServ(String inputString)
    	{
    	System.out.println("This is ABC Web Service!");
    	try
    	{
    	 InitialContext ic = new InitialContext();
    	 DataSource ds = (DataSource) ic.lookup("jdbc/ABCDB");
    	 Connection conn = ds.getConnection("db2admin","db2admin");
    
    	 Statement st = conn.createStatement();
    	 String mySQL = "insert into administrator.employee (empno) 
             values('"+inputString+"')";
    	 System.out.println("The query is " + mySQL);
    	 st.executeUpdate(mySQL);
    	  return "OK";
    	}
    	 catch (Exception e)
    	{
    	 e.printStackTrace();
    	 return "Error";
    	 }
    	}
    }
  4. 注意,要对上述代码进行更改,针对您的数据库设置、根据需要调整 SQL 连接属性和 SQL 插入语句。
  5. 保存更改。
  6. 右键单击 ABCService 应用程序并导航到 Properties > Service Policies。如图 7 所示选中 Enable project specific settings
    图 7. 服务策略设置
    服务策略设置
  7. WebSphere Policy Sets > WebSphere v7.0 Policy Sets 中,选择 WSTransaction 并选中 Set as default,如图 8 所示。
    图 8. 设置默认策略
    设置默认策略
  8. 保存更改。
  9. 右键单击 ABCService.java 并选中 Web Services > Create Web service,如图 9 所示。
    图 9. 创建 web 服务
    创建 web 服务
  10. 在 Web Services 向导中,确保 web 服务运行时是 IBM WebSphere JAX-WS,如图 10 所示。
    图 10. 配置 JAX-WS
    配置 JAX-WS
  11. 选择生成 WSDL,如图 11 所示。
    图 11. 生成 WSDL 到 web 服务项目中
    生成 WSDL 到 web 服务项目中
  12. 完成向导中的其余步骤,生成 web 服务。
  13. 将更改保存到应用程序。

开发业务流程应用程序

要开发 ABCBPEL 业务流程应用程序:

  1. 启动 Integration Developer 并打开 Business Integration 透视图。
  2. 右键单击 Projects 面板并选择 New > Project > Module
  3. 输入模块名 ABCBPEL,如图 12 所示,单击 Finish
    图 12. 工作空间中的 ABCBPEL 模块
    工作空间中的 ABCBPEL 模块

开发 web 服务导入

  1. 在 Integration Developer 调色板中的 Components 面板中,将一个 Import 组件拖拽到组装图,将其命名为 Import1
  2. ABCServiceService.wsdlABCServiceService_schema1.xsdABCService 模块复制到 ABCBPEL,并确保 ABCServiceDelegate 接口在 “Interfaces” 下列示,如图 13 所示。
    图 13. 将 WSDL 从 web 服务复制到 BPEL 模块
    将 WSDL 从 web 服务复制到 BPEL 模块
  3. ABCServiceDelegate 添加为 Import1 的接口。
  4. 右键单击 Import1 并选择 Generate Bindings > Web Service Binding,如图 14 所示。
    图 14. 为导入生成 web 服务绑定
    为导入生成 web 服务绑定
  5. 在 Binding 向导中,选择 Use an existing web service port
  6. 在下一个窗口中,选择 “Matching service ports” 下方的 ABCServicePort,如图 15 所示。
    图 15. 选择 web 服务端口
    选择 web 服务端口
  7. Select a Transport Protocol 窗口中,选择默认值 SOAP 1.1/HTTP
  8. 单击 Finish,然后单击 OK
  9. Properties > Binding 中,确保 Address 字段中的 hostname 和 port 正确指定。
  10. Properties > Binding > Policy Sets 中,选择 Default policy setWSTransaction,如图 16 所示。
    图 16. 设置 WSTransaction 策略组为 Import
    设置 WSTransaction 策略组为 Import

开发业务流程

  1. 在 Integration Developer 调色板中的 Components 面板中,将一个 Process 组件拖拽到组装图,将其命名为 Component1
  2. 使用 Component1 中的 Add Interface 按钮来打开 Interface 向导并创建一个名为 BPELInterface 的新接口。
  3. 连接 Component1Import1,单击弹出消息(提示引用伙伴创建)上的 OK,如图 17 所示。
    图 17. 连接导入和 BPEL 流程
    连接导入和 BPEL 流程
  4. 右键单击 Component1,然后单击 Generate Implementation
  5. Properties > Details 选项卡中,将 Business process type 更改为 Microflow,如图 18 所示。
    图 18. BPEL 组件实现为 microflow
    BPEL 组件实现为 microflow
  6. 在 Receive 活动之后从调色板添加一个 Snippet 并将其命名为 Snippet
  7. Properties > Details 中,选择 Java 并添加清单 2 中的代码。
    清单 2. Snippet 的代码
    System.out.println("ABC BPEL");
  8. 在 Variables 面板中创建一个 variable 并将其命名为 input1,如图 19 所示。
    图 19. 在 BPEL 中创建 input1 变量
    在 BPEL 中创建 input1 变量
  9. Snippet 之后添加一个 Assign 活动并将 input1 映射到 parameters.arg0,如图 20 所示。
    图 20. 将 input1 映射到 web 服务参数
    将 input1 映射到 web 服务参数
  10. 添加一个 Invoke 活动并配置 Properties > Details 选项卡,如图 21 所示。
    图 21. 在 BPEL 中配置 Invoke 活动
    在 BPEL 中配置 Invoke 活动
  11. Invoke 之后添加另一个 Snippet 活动并将其命名为 Snippet1
  12. Properties > Details 选项卡中,选择 Java 并添加清单 3 中的代码。
    清单 3. Snippet1 的代码
    System.out.println("After invoke" + input1);
    if (input1.equalsIgnoreCase("fail"))
    {
    	System.out.println("Raise fault...");
    	raiseFault(new QName("http://test.ibm.com/ABCBPEL","Fault"));
    }
    System.out.println("Done BPEL!");
  13. 保存 Component1 和组装图。

设置应用程序中的事务型限定符

事务型限定符(transactional qualifier)是 Integration Developer 中提供的众多服务质量限定符中的一个。需要 设置 3 个限定符:Component1 实现的 Transaction、Import1 引用的 Join Transaction、以及 Componet1 接口的 Suspend Transaction。记住,微流(microflow)是一个同步实现,所有活动都将在一个事务中执行。

表 1 总结了本教程需要的事务型限定符。

表 1. 事务型限定符
限定符位置说明
Transaction Component1 实现 Global 使业务流程和 web 服务加入一个单一事务上下文。
Suspend Transaction Component1 引用 False 当业务流程同步调用 web 服务时,这个限定符规定业务流程将把事务上下文传播到 web 服务(Import)。
Join Transaction Import1 接口 True 使 web 服务(Import)加入业务流程传播的事务。

要进一步了解事务型服务质量,请参阅信息中心主题:服务质量限定符参考

在 Integration Developer 中,按如下步骤设置事务型限定符:

  1. 导航到 Component1Properties > Implementation
  2. 添加 Transaction 服务质量。
  3. Value 列中,从列表中选择 Global,如图 22 所示。
    图 22. 添加 Transaction 服务质量
    添加 Transaction 服务质量
  4. 保存更改。
  5. 导航到 Component1Properties > Details > References > ABCServiceDelegatePartner
  6. 添加 Suspend transaction 服务质量。
  7. Value 列中,从列表中选择 False,如图 23 所示。
    图 23. Suspend transaction 服务质量
    Suspend transaction 服务质量
  8. 保存更改。
  9. 导航到 Import1Properties > Details > Interfaces > ABCServiceDelegate
  10. 添加 Join transaction 服务质量。
  11. Value 列中,从列表中选择 True,如图 24 所示。
    图 24. Join transaction 服务质量
    Join transaction 服务质量

部署应用程序

下一步就是将应用程序部署到相应的应用程序服务器。ABCBPEL 应用程序将部署到 WebSphere Process Server,ABCService 应用程序部署到远程 WebSphere Application Server。

部署 ABCBPEL 应用程序

  1. 在 Integration Developer 中右键单击 ABCBPEL 模块并选择 Export > Java EE > EAR file
  2. 将模块导出为 ABCBPEL.ear 以便部署。
  3. 启动 Process Server 集成测试服务器。
  4. 启动管理控制台。
  5. 将应用程序部署到应用程序服务器。
  6. 导航到 Services > Service clients 并单击 ABCServiceService(图 25)。
  7. 在 Policy set attachments 面板中,选中 ABCServiceService
    图 25. 服务客户端
    服务客户端
  8. 单击 Attach Client Policy Set > WSTransaction,将策略组附加到应用程序(图 26),如果该策略组还没有被附加的话。
    图 26. 附加 WSTransactions 客户端策略组
    附加 WSTransactions 客户端策略组
  9. 保存更改并重新启动测试服务器。

部署 ABCService 应用程序

  1. 右键单击 ABCService 应用程序并选择 Export > Java EE > EAR file
  2. 将应用程序导出为 ABCServiceApp.ear 以便部署。
  3. 启动 WebSphere Application Server.
  4. 启动管理控制台。
  5. 将应用程序部署到服务器。
  6. 导航到 Services > Service Providers 并单击 ABCServiceService,如图 27 所示。
    图 27. 服务提供者
    服务提供者
  7. 在 Policy set attachments 面板中,选中 ABCServiceService
  8. 单击 Attach > WSTransaction 将策略组附加到应用程序,如果策略组还没有被附加的话。
    图 28. 将 WSTransaction 策略组附加到服务
    将 WSTransaction 策略组附加到服务
  9. 保存更改并重新启动应用程序服务器。

确保应用程序已在两个应用程序服务器上成功启动。


配置服务器

在运行应用程序场景之前,需要进一步配置服务器。

web 服务应用程序使用一个数据源连接到数据库,因此需要在 WebSphere Application Server 中创建一个数据源。

  1. 创建一个名为 ABCDB 的新数据源,作用域为 Cell,如图 29 所示。
    图 29. 数据源属性
    数据源属性
  2. 确保数据源支持 XA。为加入全局事务上下文,数据源需要支持 XA。
  3. 确保数据源属性设置遵从 ABCService.java 中设置的数据源连接属性(见图 30)。
    图 30. 数据源连接属性
    数据源连接属性

如果应用程序服务器启用了安全保护,则运行应用程序前需要进一步配置:

  1. 需要将 Light-weight Third Party Authentication (LTPA) 令牌从 Process Server 导入 Application Server。信息中心详细描述了 导出导入 LTPA 令牌的过程。
  2. 需要从 Application Server 导入 Secure Sockets Layer (SSL) 证书并将其添加到 Process Server 的信任存储,以避免 SSL 握手错误。

测试事务行为

由于所有必要配置都已完成,您现在可以测试事务行为了。

场景:事务提交

  1. 转到 Integration Developer 并打开 ABCBPEL 模块。
  2. 右键单击组装图中的 Component1 并选择 Test Component
  3. 导航到 Initial request parameters,输入值 success 并调用请求。
  4. 业务流程调用 web 服务(见图 31)。事务上下文被传播到 web 服务,但由于事务型限定符设置,web 服务事务将在客户端事务上下文中执行。
  5. web 服务读取输入参数,然后在数据库中添加一行。这个数据库事务还将在客户端上下文中运行。
    图 31. Test Component 运行 1
    Test Component 运行 1
  6. 验证数据库,确保记录已输入数据库表(见图 32)。
    图 32. 验证数据库表
    验证数据库表
  7. 事务将在调用 Snippet1 之后提交。

在这个场景中,事务上下文从 Process Server 和 web 服务传播。所有数据库事务都加入一个全局事务上下文。

场景:事务回滚

  1. 转到 Integration Developer 并打开 ABCBPEL 模块。
  2. 右键单击组装图中的 Component1 并选择 Test Component
  3. 导航到 Initial request parameters,输入值 fail,然后调用请求。
  4. 业务流程调用 web 服务。
  5. web 服务读取参数,然后在数据库中写入一条记录。
  6. 此时,事务仍然处于活动状态,Snippet1 被调用。
  7. 在 Snippet1 中,请求参数受到检查,如果是 “fail”,将导致一个 BPEL 故障。
  8. 一个 ServiceRuntimeException 被抛入业务流程,这将触发全局事务回滚,如图 33 所示。
    图 33. 测试组件结束于 ServiceRuntimeException
    测试组件结束于 ServiceRuntimeException
  9. 检查数据库表,您将发现记录没有提交到数据库,数据库中没有条目 “fail”。
    图 34. 出现异常后验证数据库
    出现异常后验证数据库

在这个场景中,事务回滚由业务流程中生成的 ServiceRuntimeException 触发。由于事务上下文被 web 服务和数据库使用,web 服务和数据库的对应事务也被回滚,从而确保了数据完整性。ServiceRuntimeException 本身使用一个 BPEL 故障诱发。


结束语

在本教程中,您学习了如何使用业务流程和一个使用 WS-AT 的 web 服务设置一个全局事务。WebSphere Application Server 中的 web 服务策略组促成了 web 服务事务。如本教程所述,应用程序中的 WS-AT 支持通过几个配置步骤实现。应用程序开发人员不需要额外编码或进行应用程序级配置。

致谢

本文作者对 IBM Thailand 的 Technical Sales 的 Skulrat Charoenphong 对本教程的审阅表示感谢!


下载

描述名字大小
代码样例WS-ATProjectInterchange.zip37KB

参考资料

学习

获得产品和技术

讨论

条评论

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=WebSphere, SOA and web services
ArticleID=632049
ArticleTitle=在 WebSphere Process Server V7 中实现 web 服务事务
publish-date=03142011