欢迎光临!

使用 WS-AtomicTransaction 构建事务 Web 服务

上一篇 / 下一篇  2008-09-11 10:52:11

本文介绍如何使用 IBM® Rational® Application Developer for WebSphere® V7 创建事务 Web 服务提供程序,以及如何使用 Microsoft .NET 3.0 Software Development Kit 创建相应的服务使用程序。本文将向您介绍使用 WebSphere Application Server V6.1 和 Microsoft™ .NET™ Framework 进行开发所需要的步骤,其中包括针对两个平台的故障诊断提示和技巧。

引言

2005 年 8 月,IBM、Microsoft、IONA®、BEA® 和合作伙伴共同发布了一系列 Web 服务规范,该规范使应用程序能够以事务方式调用 Web 服务。这些规范包括:

  • 处理短期事务活动的 WS-AtomicTransaction (WS-AT)。像使用其他事务系统(如 Java™ Transaction API (JTA) 或客户信息控制系统 (CICS))一样,您可以利用 WS-AT 来确保 Web 服务参与者进行的所有资源更新作为一个工作单元完成或回滚。
  • WS-BusinessActivity (WS-BA) 可以解决长时间运行活动的协作问题并支持补偿概念。
  • WS-Coordination (WS-Coor) 提供创建和交换事务上下文的基础机制。

WebSphere Application Server V6 和 V6.1、WebSphere Process Server V6、CICS Transaction Server V3.1 和 Microsoft .NET 3.0 Windows Communication Framework (WCF) 都支持 WS-AT。

本章将阐述 WS-AT 的基本概念,并指导您完成在 WebSphere Application Server 和 Microsoft .NET 3.0 之间构建事务 Web 服务的关键步骤。本文的目标读者是希望构建并部署跨不同平台的事务 Web 服务的 Web 服务开发人员、架构师和管理员。并且应该对 Java 编程、Web 服务开发、WSDL 和 SOAP 有基本的了解。

概述

WS-AT 通常用于协调 Web 服务参与者执行的活动,使所有的更新在单个工作单元中完成。例如,零售业可能需要保证有可用的库存并在发货之前收到付款。InventoryService、PaymentService 和 ShipmentService 可以驻留在使用异类技术堆栈的不同系统中,甚至可以跨组织边界。WS-AT 可以确保以事务方式执行对这三种 Web 服务的调用,并向应用程序提供原子性、一致性、隔离性和持久性 (ACID) 语义。

因为基础平台提供这一质量的服务,所以对于故障或超时条件,Web 服务开发人员无需开发自定义错误处理逻辑或进行手动撤消。

图 1 显示了一个示例,在该示例中,订单处理功能 (SubmitOrder.jsp) 使用 Web 服务调用以下三个服务提供程序来更新多个系统:InventoryService、PaymentService 和 ShipmentService。这些服务提供程序运行在不同的操作环境中,并访问不同的数据库和/或资源。借助 WS-AT,所有更新将通过一个全局事务进行协调。


图 1. 提供事务支持的订单处理示例
图 1. 提供事务支持的订单处理示例 

先决条件

要完成本文中的示例,您需要在 Microsoft Windows™ XP 平台上安装以下软件:

WS-AT 与操作系统和平台无关。例如,您可以使用在其他分布式平台(如 Linux、AIX 或 zOS)上运行的 WebSphere Application Server 以事务方式与在 Microsoft 平台(如 Windows Vista、Windows Server 2003 或 Windows XP)上运行的 Microsoft .NET 进行互操作。

WebSphere Application Server V6 用户必须使用 WebSphere Application Server V6.0.2.19 (或更高版本)来与使用 WS-AT 的 Microsoft .NET 进行互操作。

入门

图 2 概述了构建事务 Web 服务使用程序和提供程序的主要步骤。


图 2. 在 WebSphere 和 .NET 之间启用 WS-AT 的主要步骤
图 2. 在 WebSphere 和 .NET 之间启用 WS-AT 的主要步骤

以下各部分将描述这些步骤。

步骤 1:使用 Rational Application Developer 开发事务 Web 服务提供程序

本文中的示例遵循自顶向下的方法。首先,我们将创建 WSDL 文档来描述服务接口 HelloWorldTX,然后生成服务实现,最后将介绍对服务端点的事务支持。

创建 WSDL 文档

若要承载服务提供程序,则需要使用适当的 Web 模块创建 Java® 2 Platform. Enterprise Edition® (J2EE) 企业应用程序对象,具体操作如下:

  1. 在 Rational Application Developer 中启用 J2EE 和 Web 服务开发人员功能,方法是选择Windows => Preferences => General => Capabilities,并选中Web DeveloperWeb service Developer
  2. 通过选择File => New => Project创建一个新的 J2EE 对象。选择J2EE – Enterprise Application Project,并单击Next
  3. 输入HelloWorldTX作为Project Name,选择WebSphere Application Server v6.1作为Target Runtime,然后单击Next
  4. 接受 Project Facets 的缺省值,并单击Next
  5. 通过选择New Module创建新的 Web 模块。取消选中Application Client ModuleEJB ModuleConnector Module,然后单击Finish
  6. 单击Finish,完成 J2EE 对象的创建。
  7. 在 J2EE 透视图中,展开新的HelloWorldTX对象,右键单击WebContent,选择New => ther = > Web Services => WSDL,并单击Next
  8. 输入HelloWorldTX.wsdl作为File Name,并单击NextFinish接受缺省值。
  9. 下载示例HelloWorldTX.wsdl,剪切内容并将其粘贴到新建的 HelloWorldTX.wsdl 文件中。

生成服务实现

要生成服务实现,请完成以下步骤:

  1. 右键单击HelloWorldTX.wsdl,选择Web Services => Generate Java bean skeleton,并单击Finish
  2. 将生成的 HelloWorldTXSOAPImpl.java 更改为return “Hello, ” + in;

启用 WS-AT 事务支持

在 WebSphere Application Server 中,WS-AT 事务支持是使用部署描述符指定的。不需要任何特殊 Java 代码。

  1. 展开HelloWorldTXWeb => WebContent => WEB-INF,并打开web.xml
  2. Servlets选项卡上,选择HelloWorldTXSOAPImplServlet。
  3. 向下滚动右侧的选项列表。在WebSphere Extensions => Global Transaction下,选中Execute using Web Services Atomic Transaction on incoming requests
  4. 按 Ctrl+S,保存对 Web 部署描述符 (web.xml) 的更改。

    这将指示 WebSphere 运行时处理接收的任何 WS-AT 上下文,并在外部请求程序协调的全局事务下分派应用程序组件。

此时,HelloWorldTX Web 服务便可以使用了。

步骤 2:使用 Microsoft .NET Framework 3.0 开发事务 Web 服务使用程序

Microsoft .NET Framework 3.0 支持事务 Web 服务。服务使用程序可以是独立的 .NET 应用程序或者是在 Internet Information Services (IIS) 中运行的 Web 应用程序。在本文中,我们将构建访问 WebSphere 中的 HelloWorldTX 服务的独立 C# 客户机应用程序。

以下各步骤将描述如何使用 WSDL 文档从头构建 C# 客户机。还可以下载本文提供的预构建 .NET 客户机。

  1. 通过选择Windows SDK => CMD Shell启动 Windows SDK 命令 Shell。
  2. 创建工作目录存储客户机源代码(例如 C:\HelloWorldTXConsoleClient),并更改到该目录。
  3. 将 HelloWorldTX.wsdl 从 Rational Application Developer 工作区复制到工作目录。
  4. 通过发出以下命令生成 C# 代理类:svcutil HelloWorldTX.wsdl
  5. TransactionFlowAttribute属性添加到生成的 HelloWorldTX.cs 源文件,如清单 1 所示:

    清单 1. C# 中的 HelloWorldTX 接口
    public interface HelloWorldTX
    {
        
        // CODEGEN: Generating message contract since element name in from 
    namespace is not marked nillable[System.ServiceModel.TransactionFlowAttribute(System.ServiceModel.Trans
    actionFlowOption.Mandatory)][System.ServiceModel.OperationContractAttribute
    Action="http://helloworldtx.example.wsat.ibm.com/
    sayHello", ReplyAction="*")]
    	sayHelloResponse sayHello(sayHelloRequest request);

  6. 创建简单的 HelloWorldTXConsoleClient C# 类,以触发对 Web 服务操作的调用。清单 2 显示了一个示例 HelloWorldTXConsoleClient.cs。

    清单 2. HelloWorldTXConsoleClient.cs
    using System;
    using System.Transactions;
    
    namespace HelloWorldTXConsoleClient
    {
        class HelloWorldTXConsoleClient
        {
            static void Main(string[] args)
            {
                // start transaction
    
                using (TransactionScope transScope = new 
    TransactionScope(TransactionScopeOption.RequiresNew))
                
                {
                    HelloWorldTXClient proxy = new HelloWorldTXClient();
                    Console.WriteLine("Invoking HelloWorldTX service...");
    
                    // invoke HelloWorldTX running on WebSphere with WS-AT
    
                    String response = proxy.sayHello("World");
                    transScope.Complete();
    
                    Console.WriteLine("Transaction completed successfully.
    Response = " + response);
                }
            }

  7. 为指定客户机端点和传输协议创建 HelloWorldTXConsoleClient.exe.config 文件,如清单 3 所示。此场景需要自定义绑定(而不是 .NET 中的标准 wsHttpBinding),因为 wsHttpBinding 缺省使用 SOAP 1.2。另一方面,WebSphere Application Server V6.1 支持 SOAP 1.1。

    清单 3. HelloWorldTXConsoleClient.exe.config
    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
        <system.serviceModel>
            <bindings>
                <customBinding>
                    <binding name="Soap11AddressingBinding" transactionFlow="true">
                       <textMessageEncoding messageVersion="Soap11WSAddressing10" />
                       <transactionFlow transactionProtocol=
    			"WSAtomicTransactionOctober2004"/>                  
                       <httpTransport/>
                    </binding>
                </customBinding>
            </bindings>
            <client>
                <endpoint address="http://localhost:9080/
    			HelloWorldTXWeb/services/HelloWorldTXSOAP"
                    binding="customBinding"
                    bindingConfiguration="Soap11AddressingBinding" 
                    contract="HelloWorldTX" name="HelloWorldTXSOAP" />
            </client>
        </system.serviceModel>
    </configuration>

  8. 通过在 Windows SDK 命令 Shell 提示符处输入以下命令编译所有源文件:
    csc HelloWorldTX.cs HelloWorldTXConsoleClient.cs /reference: "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\System.ServiceModel.dll"; "%ProgramFiles%\Reference Assemblies\Microsoft\Framework\v3.0\System.Runtime.Serialization.dll".
  9. 确认 HelloWorldTXConsoleClient.exe 是否成功生成。

步骤 3:在 Microsoft Distributed Transaction Coordinator (MSDTC) 中启用网络访问

在 Windows XP 中,在缺省情况下禁用对分布式事务和 WS-AT 的支持。要启用它,请执行以下操作:

  1. 安装Update for Windows Communication Foundation (KB912817)
  2. 安装WS-AtomicTransaction Configuration MMC Snap-in (WsatUI.dll)(WsatUI.dll),并通过输入以下命令注册 DLL:
    C:/> regasm /codebase "%PROGRAMFILES%\Microsoft SDKs\Windows\v6.0\Bin\WsatUI.dll"
  3. 通过执行以下操作启用 DTC 网络访问:
    • 选择Control Panel => Administrative Tools => Component Services。在Console Root下,展开Component Services => Computers
    • MMC中右键单击My Computer,选择Properties,然后单击MSDTC选项卡。
    • 单击Security Configuration
    • 在 Security Configuration 对话框中,选中以下选项(如图 3 所示):Network DTC AccessAllow Remote ClientsAllow InboundAllow OutboundEnable TIP TransactionsEnable XA Transactions

      图 3. 安全配置
      图 3. 安全配置

    • 单击OK,然后再单击OK退出对话框。

步骤 4:为 WS-AT 消息交换设置 WebSphere 安全性、SSL 证书和事务服务

WebSphere Application Server 支持事务协议消息(例如 Register、Prepare、Commit 和 Rollback)的安全或非安全交换。不过,Microsoft .NET 需要使用 SSL 相互验证来保护协议消息。这意味着需要配置 SSL 安全性,并在 WS-AT 跨两个平台进行操作之前设置证书。

在生产环境中,将对每个参与者使用正式证书颁发机构的证书。不过,为了简单起见,在本示例中我们将为 WebSphere 和 .NET 生成自签名证书。为此,请完成以下操作步骤:

  1. 使用 WebSphere 管理控制台启用 WebSphere 全局安全性。在Security => Secure administration, applications, and infrastructure下,单击Security Configuration Wizard
    • 选中Enable Application Security,并单击Next
    • 选择Local Operating System,并单击Next
    • 输入<your-operating-system-userid>作为Primary administrative user name,并单击Next
    • 单击Finish
  2. 使用管理控制台创建自签名证书,具体操作如下:
    • 选择Security => SSL certificate and key management => Key Store and Certificates => NodeDefaultKeyStore => Personal certificates => Create a self-signed certificate
    • 指定以下各值,然后单击OK
      • Alias=<your_hostname>
      • Common Name=<your_hostname>。(证书上的公用名必须与计算机的带有后缀的 DNS 名称匹配。)
      • Organization=<your_organization_name>
    • 单击Save Changes to Master Configuration
  3. 要将新建的证书指派为缺省值,请选择Security => SSL certificate and key management > SSL configurations => NodeDefaultSSLSettings,然后为Default server certificate aliasDefault client certificate alias选择新建的证书。然后单击OK
  4. 将签名者证书导入到信任存储,方法是选择Security => SSL certificate and key management => Key stores and certificates,然后选择NodeDefaultKeyStoreNodeDefaultTrustStore,并单击Exchange signers
  5. 选择新建的证书,并通过单击Add,然后单击OK将其添加到 NodeDefaultTrustStore。
  6. 通过执行下面的操作配置 WebSphere 事务服务:
    • 选择Servers => Application servers => server1 => Container Services => Transaction Service
    • 取消选中Enable protocol security。对于 .NET 互操作性必须禁用此选项。仍将使用 SSL 传输级别的安全性保护协议消息,但将禁用接收协议消息的基于角色的授权。传输协议消息的基于角色的授权仅支持 WebSphere 到 WebSphere 的交互。
    • 对于HTTPS proxy prefix,请输入https://<your_websphere_server_hostname>:9443。如果没有使用缺省端口(为 WCInboundDefaultSecure Web 容器传输链配置的端口),则使用 SSL 入站端口替换9443。注意:如果 WebSphere 服务器位于 HTTPS 代理后面,则应该使用 HTTPS 代理的主机名。
    • 单击OK
  7. 此外,还应启用 WebSphere Web 服务消息跟踪以验证 WS-AT 是否正常运行。选择Troubleshooting => Logs and Trace => server1 => Diagnostic Trace => Change Log Level Details,然后添加以下跟踪规范:com.ibm.ws.webservices.trace.MessageTrace=finest,并单击OK
  8. 保存更改,并停止 WebSphere Application Server。
  9. 如果您正在使用 Rational Application Developer 或 WebSphere Application Server 工具包,请打开服务器配置,并展开 Security 部分。选中Security is enabled on this server,并输入用于启用 WebSphere Global Security 的用户 ID 和密码。按Ctrl+S,以保存更改。
  10. 重新启动 WebSphere Application Server。

步骤 5:导入 SSL 证书,并在 Windows XP 中配置 WS-AT

MSDTC 负责事务管理和 WS-AT 消息的处理。可以按照下面的步骤配置 MSDTC。要使 WS-AT 工作,必须将 SSL 证书导入到LocalMachineCertificate Store(而不是 User Certificate Stor),因为 MSDTC 流程要在不同的安全上下文中运行。

  1. 选择Start => Run => mmc,打开 Microsoft 管理控制台。
  2. 在 MMC 中,选择File => Add/Remove Snap-in => Add => Certificates => Add => Computer Account => Next => Local Computer => Finish => Close => OK
  3. 展开Certificates, Personal
  4. 选择Action, All Tasks, Import…, Next, Browse…
    • Filename =%WAS_HOME%\profiles\<your-server>\config\cells\<your-cell>\nodes\<your-node>\key.p12
    • Password =WebAS
    • 将其放入 Personal Certificate Store,单击Next,然后单击Finish
  5. 展开 Certificates, Trusted Root Certificate Authority,并重复上面的步骤 4,将证书导入到信任 CA 存储。
  6. 关闭 MMC。
  7. 单击Start => Control Panel => Administrative Tools => Component Services => Computers => My Computer
  8. 右键单击My Computer,选择Properties,然后选择WS-AT选项卡。在 WS-AT 选项卡上,请执行以下操作:
    • 选中Enable WS-Atomic Transaction network support
    • Endpoint certificate字段中,单击Select,并选择新导入的证书(将主机名作为别名)。
    • Authorized certificates字段中,单击Select,如图 4 所示。

      图 4. 配置 WS-AT
      图 4. 配置 WS-AT

    • 检查新创建的证书,并单击OK,如图 5 所示。

      图 5. 选择授权证书对话框
      图 5. 选择授权证书对话框

  9. 单击OK,并根据提示重新启动 MSDTC。

步骤 6:测试端到端的消息流

现在可以测试 .NET 和 WebSphere 之间的端到端消息流了。通过从命令提示符运行 HelloWorldTXConsoleClient.exe 启动 .NET 客户机应用程序。如果一切工作正常,您应看到返回的Hello, World响应消息。

要验证事务消息交换是否发生,请打开 %WAS_HOME%/profiles/<your-server>/logs/server1/trace.log,并搜索wsat,以查找 WS-AT 消息交换的详细跟踪信息。图 6 显示了消息流的整个序列。


图 6. .NET 和 WebSphere 之间的详细消息流
图 6. .NET 和 WebSphere 之间的详细消息流

正如您看到的,需要多个 SOAP 消息交换才能处理事务 Web 服务调用。在本示例中,应用程序 SOAP 消息和 WS-AT 事务消息交换使用不同的端点 URL 和 TCP 端口。

故障诊断提示与技巧

如果遇到端到端的流问题,请检查 trace.log 中的 WebSphere MessageTrace,以查看消息交换的进度。下面是要检查的一些内容:

  • 请求 1:来自 .NET 的应用程序请求是否包含 SOAP 标头和事务上下文?如果不包含,请确认客户机代码是否正在事务中运行,以及所需的 System.ServiceModel.TransactionFlowAttribute 是否已添加到生成的代理类 HelloWorldTX.cs。
  • 请求 2:WebSphere Transaction Service 是否能够向 MSDTC 注册?如果不能,请验证请求 2 中的目标 URL 是否正确。它应该是https://<your_hostname>/WsatService/Registration/Coordinator/。还要验证 SSL 证书设置过程是否在 Windows 和 WebSphere 管理控制台上成功完成。
  • WebSphere WS-AT 和事务跟踪:使用 WebSphere 管理控制台启用此跟踪规范 (WSCoor=all:Transaction=all) 以揭示事务握手中的任何问题。FFDC 目录中的异常信息在确定根本原因上也非常有用。
  • MSDTC / WS-AT Transaction Bridge Trace:在 %windir%\system32 中创建名为 msdtc.exe.config 的文件,按照此forum thread中的描述捕捉事务握手的详细信息。
  • 如果服务使用程序或服务提供程序更新任何资源(例如,使用 JDBC),请确保配置了符合 XA 的 JDBC 驱动器,并在应用程序逻辑中使用了 XADataSource。

结束语

WS-AT 实现了一组新的 Web 服务用例,这些用例以前非常难以实现。应用程序开发人员通过它避免了与远程 Web 服务调用相关的复杂事务错误和超时处理。

在本文中,您学习了 WS-AT 的基本概念,以及如何在异类 Web 服务环境中应用它。还学习了如何从 Microsoft .NET 环境以事务方式调用 WebSphere Web 服务,以及这两个平台上的一些常见问题解决技巧。


TAG:

 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

日历

« 2008-12-02  
 123456
78910111213
14151617181920
21222324252627
28293031   

数据统计

  • 访问量: 10115
  • 日志数: 248
  • 建立时间: 2008-07-08
  • 更新时间: 2008-11-26

RSS订阅

Open Toolbar