给定一个从会话 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 公开为事务性 Web 服务。
但是,两阶段提交事务使用的锁定模型实际上只适用于同一控制域中的短期事务。如果您的服务在同一个公司数据中心运行,您可能会侥幸成功。对于更广泛的分布,无论是地理分布还是管理分布,您可能都想查看 WS-BA,这是一种专门为此类用途设计的 Web 服务事务协议。
WS-BA 使用一种更难编程的基于补偿的模型。它基本上基于您提到的技术:通过调用补偿方法来撤消服务方法的效果。这可能很难做到正确,但是 JBoss 实习生做了一个相当不错的注释框架,它允许您以最小的努力定义补偿方法并让它们自动驱动。它不是标准化的,但如果您选择这种方法,非常值得一试:http ://www.jboss.org/jbosstm/baframework
据我所知,由 Microsoft、BEA Systems 和 IBM 开发的 Web Services-Coordination (WS-C) 和 Web Services-Transaction (WS-T) 规范用于此类情况。您可以从阅读IBM 提供的Web 服务事务和Web 服务事务协议的比较文章开始看清楚。
实际上,您通常不仅需要自定义回滚方法,还需要自定义提交方法。否则,您会遇到类似于 WS-BA 标准中的问题。
看看http://www.atomikos.com/Publications/TryCancelConfirm查看详细文章。Atomikos ExtremeTransactions中提供了这些功能......该产品还支持经典的“ACID”风格的 Web 服务事务。
高温高压
盖伊
免责声明:我为 Atomikos 工作