事务回滚和 Web 服务
给定一个从会话 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 服务事务协议比较文章开始,以使其清晰明了。