给出一个从一个会话bean调用两个Web服务方法的示例,如果在调用两个方法之间抛出异常怎么办?如果不调用Web服务,则事务将回滚并且没有任何损失。但是,Web服务将不会回滚。当然,即使只有一个Web服务也存在问题。虽然这是一个通用的问题,但我对与EJB会话bean相关的解决方案感兴趣。
一种简单和自定义的解决方案是为每个“真实功能”方法添加一个特殊的“回滚方法”到Web服务中。我正在寻求的是一些标准化的方法来完成此操作。
给出一个从一个会话bean调用两个Web服务方法的示例,如果在调用两个方法之间抛出异常怎么办?如果不调用Web服务,则事务将回滚并且没有任何损失。但是,Web服务将不会回滚。当然,即使只有一个Web服务也存在问题。虽然这是一个通用的问题,但我对与EJB会话bean相关的解决方案感兴趣。
一种简单和自定义的解决方案是为每个“真实功能”方法添加一个特殊的“回滚方法”到Web服务中。我正在寻求的是一些标准化的方法来完成此操作。
有许多技术正在发展,但问题仍然足够前沿,以至于标准化过程尚未为我们提供完全可移植的解决方案。
第一种选择是使 Web 服务具备事务感知能力。当然,这假设您对它们具有控制权,尽管在某些情况下编写一个非事务性服务的事务感知代理也是一种选择。
WS-AT 和 WS-BA 协议是事务 Web 服务的主要标准。不幸的是,它们仅指定协议,而没有语言绑定。换句话说,在编程语言级别上没有标准 API。对于 Java 来说,最接近的就是 JSR-156,但它还没有准备好。
然后问题变成了:如何将 EJB(即 JTA/XA)事务与 WS 事务绑定起来。由于 WS-AT 和 XA 协议使用的模型密切相关,因此可以通过协议桥实现。一些应用服务器提供了类似的功能。JBoss 在 JavaOne 上展示了他们的产品-请参见http://anonsvn.jboss.org/repos/labs/labs/jbosstm/workspace/jhalliday/txbridge/BOF-4182.odp。
请注意,协议桥接技术也可以反向使用,以允许使用XA数据库后端的EJB作为事务性网络服务被公开。我知道微软、BEA Systems和IBM开发的Web Services-Coordination(WS-C)和Web Services-Transaction(WS-T)规范在一些情况下被使用。你可以从阅读IBM提供的Web服务事务和Web服务事务协议比较文章开始来明确了解它们。