ws-atomic transaction 2阶段提交 转
转帖http://www.ibm.com/developerworks/cn/webservices/ws-wsat/index.html
事务是构建分布式应用程序的关键,J2EE事务广泛使用了JTA事务。随着Web服务技术逐渐走向成熟并深入发展,事务技术在Web服务中的重要性也日益彰显。WS-AT (WS- Atomic Transaction) 定义了Web服务原子事务的协调类型,主要使用两阶段提交做为协调协议。目前IBM WAS 6.0(WebSphere Application Server 6.0)已经支持WS-AT事务(Web Services Atomic Transaction for WebSphere Application Server , WS-AT for WAS)。在这篇文章中我们将讲述WS-AT规范,WAS6.0对WS-AT事务的支持,并用RAD6.0(Rational Application Developer 6.0) 开发一个具体的WS-AT事务例子来加以说明。
<!--START RESERVED FOR FUTURE USE INCLUDE FILES--><!-- include java script once we verify teams wants to use this and it will work on dbcs and cyrillic characters --><!--END RESERVED FOR FUTURE USE INCLUDE FILES-->
回页首
?
回页首
?
回页首
?
下面就让我们一步一步的来完成这个例子。
启动WAS Server后,运行管理控制台,创建CloudScape JDBC Provider, 将WSAT数据库注册为Datasource,JNDI名字是jdbc/wsat,如图4所示,后面的AccountManager EJB将会用到这个数据源。
图4 在WAS 管理控制台中创建数据源
在J2EE透视图中,在新建的项目中新建一个会话Bean,名字是AccountManager,在AccountManager EJB中增加对Account的EJB引用,同时设定Account CMP的connection为jdbc/wsat。
然后在会话Bean接口中增加如下两个方法,用来实现转账功能中的取款和存款功能,如清单 1 所示:
清单 1: AccountManager接口
清单 3:AccountManagerBean的deposit方法实现
以上代码比较简单,在此我们就不具体解释了。完成以上操作后,将AccountManager EJB发布为Web Service,生成WSDL文件。
具体步骤是:新建一个Web Service项目,选择Web Service type为EJB Web Service,选择正确的EJB project和EAR project(如图6),输入Router Project的名字,这里指定名字AccountManagerRouter。点击Next后确定发布的Web Service的WSDL文件和两个方法(如图7)。
图6 选择EAR Project和EJB project
图7 确定要发布的Web Service的WSDL文件和两个方法
最后需要将该Web project发布为Web Service,在该项目内新建一个Java Bean Web Service,指定上面创建的WebBankManager Java类,生成WebBankManager.wsdl文件。
目前,例子中所有的项目已经创建完成,J2EE透视图中的项目如图9所示,所做的工作和开发普通的EJB、Web Service没有什么区别。
图9 创建好的示例应用
为了支持WS-AT,我们需要额外设置一下Web项目的事务选项,如图10所示。对于WebBankManager Web Service来说,它接受请求后创建UserTransaction全局事务,并将事务上下文发送出去。而AccountManager WebService接受到事务后需要参与到全局事务并执行操作。
图10 设置应用的事务选项
以上设置完成后,部署发布应用程序,就可以测试我们的工作了。启动WAS Server后, 发布导出的WebBankManagerEAR和AccountManagerEAR,运行WebBankManagerClient中的TestClient JSP测试页面,输入转账的两个账号和金额,点击invoke就OK了,如图11所示。
图11 测试页面
我们看一下后台的输出,如清单 5 所示:
清单 5: 例子的后台输出
回页首
?
5. 总结和展望
从上面例子可以看出,使用WAS6.0和RAD6.0开发一个WS-AT事务是非常容易的。由于WAS支持标准的WS-AT规范,在事务服务上可以和其它实现了WS-AT规范的产品进行集成,例如.NET上的非J2EE事务,由于使用了标准的符合WS-AT规范的SOAP消息,WAS中的事务Context可以传递到.NET的Web service中,双方可以进行互操作从而完成一个跨平台的全局事务。
同时,我们也应该看到,目前WAS仅仅支持AT事务,不支持BA事务。由于AT事务主要用于企业内的事务持续时间比较短的环境下,而这通常由普通的J2EE事务就可以完成了。在Web Service的环境下,事务更多的是以BA事务的形式出现的,跨企业多方协作,并常与BPEL流程等结合在一起。对于如何对事务进行补偿,如何处理长时间运行下可能出现的网络故障甚至系统崩溃,如何对非信任域的多方进行协调等问题,目前这些还不成熟,在Web服务事务的进一步发展过程中这些问题会逐步解决,WAS的未来版本肯定也会支持,让我们拭目以待。