2010-06-30 30 views
6

背景春季分佈式事務涉及RMI調用嗎?

我有Spring客戶端應用程序,它使用RMI爲兩臺服務器提供服務。在客戶端,我將一個實體保存到數據庫(簡單),並將rmi調用到兩個服務器,並提供實體的詳細信息。我在服務器上使用Spring 3.0.2,客戶端是一個簡單的Spring-mvc站點。

要求

我的要求是,如果任何RMI調用失敗,整個事務回滾的服務器,這是實體不會被保存在客戶端上,如果任何RMI調用是成功,這也回滾了。

我對分佈式事務是比較新的,但我想我想要一個使用RMI調用的XA事務。

我的確在here這個主題上找到了一個很好的鏈接,但是它沒有提到調用兩個遠程方法調用到不同服務器的模式。我很想聽聽更多關於推薦閱讀方面的主題,以及如何使用spring實現這一點的任何指示。爲此可能使用事務管理器嗎?

謝謝。

回答

3

這是如何在理論上處理這種情況。首先,你需要在每個節點上有幾個JTA分佈式事務管理器。一個充當主人,另一個充當奴隸。主站將分佈式事務的提交/回滾協調到從站。獨立的JTA實現存在,例如, JOTM

Vanilla RMI不支持傳播上下文信息,如操作的事務ID。但我認爲RMI已經掛鉤了,因此可以擴展到支持這一點。你可以看看Carol

您將需要使用XAResource來包裝交易參與者,以便他們可以參加分佈式交易。主服務器需要向從服務器發送提交/回滾消息,這需要使用XATerminator來執行相應的操作。

JTA規範只是一個分佈式事務管理器,事務日誌中的操作記錄需要由服務器完成。存在用於事務日誌管理的庫,例如HOWL

我不認爲Spring可以使用 - 即使是使用分佈式事務管理器 - 也能輕鬆完成。我嘗試過一次使用RMI,通過獨立客戶端和多個從屬服務器控制分佈式事務。這是關於它的blog post。這很複雜。

如果您使用帶有IIOP的Java EE應用程序服務器,那麼您可以免費獲得所有這些信息。 IIOP支持分佈式事務傳播。客戶端可以是application client container,您可以使用UserTransaction控制交易。這實際上是一種罕見的情況,我認爲使用應用程序服務器確實是合理的。儘管如此,分佈式事務是複雜的事情,可能導致啓發式失敗,如果一個節點死亡超時,以及複雜的恢復過程。

我最後的建議是:嘗試找到一個不涉及分佈式事務的設計(如果可能的話)。這會讓你更容易。

您也許可以從BPEL compensation mechanism中獲得靈感。可能還有其他設計方法可用於錯誤處理和健壯性,從而避免使用分佈式事務。

+0

感謝您花時間深入回答。 – 2010-06-30 13:29:10

1

據我所知,Spring本身並不管理分佈式事務。它可能使用JtaTransactionManager,它又委託給Java EE服務器的事務協調器。所以據我瞭解,這種交易只適用於在應用程序容器中註冊的數據源。

你可以嘗試編寫你自己的XAResource實現(不知道它是否是最好的方法,但仍然是)並將其註冊到應用程序容器中,但Spring對此無能爲力。