2012-01-20 79 views
1

我使用Jboss 6.1以及Hibernate和HornetQ。 如果我操作數據庫中的數據並向Queue添加一條消息,該消息依賴於在我的數據實際提交給數據庫之前不希望處理該消息之前更改的數據。 所以爲了避免競爭條件,我希望將HornetQ加入到我的容器管理事務中,這樣當全局事務也被提交時,消息只會被「提交」到隊列中。在Jboss中使用HornetQ時避免競爭條件

這可能嗎?任何提示?

+0

可能的重複:http://stackoverflow.com/questions/2418292/delivery-of-jms-message-before-the-transaction-is-committed –

回答

2

這是可能的。 您將需要使用XA事務,所以你得到一個2階段提交這樣:

  • 使用XA數據源的連接到數據庫。 (您正在使用支持XA的數據庫,對不對?)
  • 使用XA HornetQ ConnectionFactory。

最簡單的方法,我發現,來驗證你實際上運行2PC事務是:

  1. 將JMS和JDBC活動後調試破線齊全,但不承諾
  2. 檢查應該是實例的交易com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple
  3. 檢查_resources字段的內容。

如果事務是XA 2PC,那麼該字段(它是一個Hashtable)將包含2個XAResource作爲鍵,一個用於JMS,另一個用於JDBC。

我不知道你最熟悉哪種架構,但我認爲容器管理的事務型無狀態會話EJB是最簡單的方法。

+0

感謝您的答案。但是我可能做錯了什麼,因爲它似乎不適合我。我在jboss 6.1中有兩個無狀態會話bean,一個會發送消息給HornetQ,另一個會消耗它。我需要爲將被注入的QueueConnectionFactory註釋什麼? (@Resource(mappedName =「java:/ XAConnectionFactory」或@Resource(mappedName =「java:/ JmsXA」)?我的jms-ds.xml應該包含什麼?謝謝你的進一步幫助。 – mostart

+0

啊,這有點兒了不同於我原先想的,你是否希望兩個SSB參與同一個事務?通常,它只是[JMS發送者和數據庫]或[JMS接收者和數據庫]或者兩者兼有(具有不同的事務),但我並不是真的清楚你想要達成的目標,你可以用文字圖表將其映射出來嗎? – Nicholas

+0

在消息傳遞設置中使用兩階段提交本身就容易出現競爭狀況。 –