2009-01-12 108 views
14

給定一個從會話Bean調用兩個Web服務方法的示例,如果在調用兩個方法之間拋出異常會怎樣?在不調用Web服務的情況下,事務將回滾並且不會造成任何損害。但是,Web服務不會回滾。當然,即使使用單個Web服務也存在問題。雖然這是一個通用問題,但我對與EJB會話bean有關的解決方案感興趣。事務回滾和Web服務

一個簡單而自定義的答案是爲每個「真實功能」方法在Web服務中添加一個特殊的「回滾方法」。我所要求的是一些標準化的方式。

回答

15

許多技術正在不斷髮展,但問題仍然非常尖銳,以至於標準化過程尚未向我們提供完全便攜的解決方案。

選項一,您可以使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數據庫後端,作爲事務性Web服務公開。

但是,兩階段提交事務使用的鎖定模型實際上只適用於同一控制域中的短期事務。如果你的服務運行在同一家公司的數據中心,你可能會逃脫。爲了更廣泛的分佈,無論是地理還是管理,你可能都想看看WS-BA,一個專門爲此設計的Web服務交易協議。

WS-BA使用了一種難以編程的基於補償的模型。它基本上基於您提到的技術:通過調用補償方法取消了服務方法的效果。這可能會很棘手,但一個JBoss實習生做了一個相當不錯的註釋框架,允許你用最小的工作量定義補償方法,並讓它們自動驅動。它不是標準化的,但是如果你選擇這種方法,很值得檢查:http://www.jboss.org/jbosstm/baframework

+0

幸運的是我們使用JBoss的工作,所以我對你提出的解決方案,尤其是最後一個環節傾斜。 – atas 2009-01-18 22:31:46

+0

大家好,這個答案現在已經5年了,它說「JSR-156還沒有準備好。」。有沒有任何更新?現在是否有一個標準來處理與soap webservices的交易?在此先感謝 – jambriz 2014-02-20 17:28:27

2

實際上,您通常不僅需要自定義回滾方法,而且還需要自定義提交方法。否則,您會遇到類似於WS-BA標準中發現的問題。

請查看http://www.atomikos.com/Publications/TryCancelConfirm瞭解詳細的文章。這裏提到的功能可在Atomikos ExtremeTransactions ...該產品還支持經典的「ACID」風格的Web服務交易。

HTH

蓋伊

聲明:我Atomikos公司