更好的处理Web服务事务

日期: 2008-07-10 作者:Daniel Rubio 来源:TechTarget中国 英文

让软件的独立片断像一个工作单元那样运行时很多软件平台长期处理的领域,并且它也是很多业务处理的核心。所有有关此画题的术语被称为“事务”。在下面的文章里,我们会阐述在Web服务环境中处理事务的问题和方法。   以运行Web服务的跨平台方式处理Web服务中的事务变得越来越重要。

由于事务的意思是一个单元的工作要么都执行,要么根本不执行,因此弥合各种不同的与平台有关的事务机制之间的差异对于很多基于SOAP的应用非常重要。   以Java平台为例,尽管JTA(Java Transaction API)提供了在Java应用中处理多种事务场景的支持,但当在任何非Java应用,例如.NET或PHP,边界的外部需……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

让软件的独立片断像一个工作单元那样运行时很多软件平台长期处理的领域,并且它也是很多业务处理的核心。所有有关此画题的术语被称为“事务”。在下面的文章里,我们会阐述在Web服务环境中处理事务的问题和方法。

  以运行Web服务的跨平台方式处理Web服务中的事务变得越来越重要。由于事务的意思是一个单元的工作要么都执行,要么根本不执行,因此弥合各种不同的与平台有关的事务机制之间的差异对于很多基于SOAP的应用非常重要。

  以Java平台为例,尽管JTA(Java Transaction API)提供了在Java应用中处理多种事务场景的支持,但当在任何非Java应用,例如.NET或PHP,边界的外部需要使用事务时,对事物支持的专门技术就显得非常有限了。

  Web服务是一种用于联系不同平台的技术。它又一系列说明说来处理各种复杂的事务。

  Web services transactions specifications由IBM、BEA和Microsoft重量级公司开发。它最近被分成了三个主要工作组:WS-Coordination,WS-Atomic Transaction以及WS-Business Activity。

  WS-Coordination定义了在Web服务之间发生的任何事务处理的底层基础。与WS-Atomic Transaction或WS-Business Activity一起使用时,WS-Coordination被用来定义注册Web服务以及协作Web服务来参与事务的机制。

  从事务的观点看,WS-Coordination的作用是建立上下文环境,用来执行和管理参与事务的不同Web服务单元。而当WS-Coordination为事务形成基础时, 它把事务协议的细节留给了另外两个说明书:WS-Atomic Transaction和WS-Business Activity.

  WS-Atomic Transaction事实上非常类似于企业软件中一个现有的宽泛的协议:两段提交协议。尽管该协议的细节已经超出了Web服务的范围,但它运行的基础则是在两种资源之间达到同步以确保持续的输出。

  笼统地说,两段提交协议以及WS-Atomic Transaction的核心都是短期操作,或者说,能够很快知道成功还是失败的事务处理。

  另一方面,WS-Business Activity被设计用于长期运行的事务。另一个主要差异是其健壮性,因为与WS-Atomic Transaction相比,它可以处理事务场景。

  WS-Atomic Transaction为事务提供了要么都做,要么不做的解决方案,而WS-Business Activity则提供了例如异常处理等功能来做进一步的补充。

  既然我们已经提出了Web服务事务的概念,你或许会问在真实的Web服务应用中如何把事务组织在一起呢?和其它说明书一样,对于这个问题,你需要Apache Software Foundation提供的一种工具Kandula 。

  作为一个Apache项目。Kandula中的事务性功能很像Axis。而Axis是Apache开发的事实上的Web服务平台。由于该项目关注在Java上,因此Kandula中对于WS-*事务的支持也是一种Java的事务性工具。

  清单1.1是使用Kandula的最简单的例子。它描述了一个使用Kandula WS-Atomic Transaction的Web服务的样子。

import org.apache.kandula.coordinator.at.TransactionManagerImpl;

public class Fullfilment  {
  
    public void order(int orderId) {
        // More Business Logic

        Inventory inventory = new Inventory().getInventory();
        TransactionManagerImpl tm =
            TransactionManagerImpl.getInstance();
        tm.begin();
        try {
            inventory.ship(orderId);
            inventory.deduct(orderId);
        }catch (Exception e) {
            tm.rollback();
        }
        tm.commit();

        // More Business Logic
    }
}

  虽然是Java代码,但很容易发现在try/catch块中嵌套的调用是调用Inventory类。该类被嵌套在Kandula TransactionManager的begin和commit方法之间。你可能还会注意到如果有错误发生,再同样的TransactionManager类中会调用一个rollback方法。

  实际上被调用的方法是Inventory类的ship()和deduct()。它们形成了事务,尽管它们是Inventory类的一部分,但也可以设想它们是由WSDL合约生成的stub类的一部分,该类负责与用Java写的远程Web服务或任何其它支持Web服务的平台进行通信。

  用这种方式的嵌套,Kandula通过Axis把事务信息传递给Inventory类,该信息随后被包裹成相应的SOAP消息用于服务终端的消费与协调。

  尽管事务通常是很多软件项目事后才想到的,但当显式管理事务的需求上升时,它们在完成软件业务功能中就扮演起关键的角色。我们提到的说明书在日益形成的面向服务架构的世界中正起到关键性的作用。

相关推荐