2012-11-15 26 views
2

我有一個使用容器管理事務的MDB(我的容器是IBM Websphere 7)。容器管理事務和工作線程的MDB

Websphere正在使用全局(JTA)事務。

如果我的MDB線程啓動一個工作線程,並且該線程開始一個事務,那麼這個新線程是否與MDB在同一個事務中?

我希望MDB線程提交其事務並在我的工作線程成功啓動後立即確認MQ消息。如果工作線程回滾,我不希望我的MDB回滾。

編輯:在線程的代碼有這一點 - 它不使用註釋:

txn = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); 
    txn.begin(); 

所以如果看txn.getStatus()會比STATUS_NO_TRANSACTION以外的東西。因此,我需要讓事務管理器適合Websphere 7,並在txn.begin()之前調用「suspend()」?預防問題的正確方法是什麼?

回答

2

將不應與onMessage()方法處於同一事務處理的代碼放入單獨的方法中,並將該方法的事務屬性設置爲REQUIRES_NEW。這將在調用方法時創建新的事務,並且此新事務的成功或失敗不會影響先前的事務。

順便說一句,你不應該在JavaEE應用程序中做顯式線程管理。

從EJB 3.0規範:

企業bean不能試圖管理線程。企業 bean不得嘗試啓動,停止,掛起或恢復線程,或者更改線程的優先級或名稱。企業bean不能嘗試管理線程組。

你可以看看使用定時服務有效地創建一個單獨的線程,同時離開線程管理到服務器。

+0

我們使用這樣的啓動線程: com.ibm.asynchbeans.WorkManager.startWork(...) –

+0

好,偉大。然後改變交易屬性,你應該沒問題。 –

+0

我發佈了一個編輯我的原始問題,關於正確的實現方式,需要在此代碼中添加新內容。謝謝。 –