2014-11-23 110 views
2

我正在使用WebSphere 8.5與EJB 3.1和JMS通用提供程序。與XA的JMS會話和JPA事務

我需要使用無狀態會話bean作爲生產者在隊列中編寫消息。 EJB由TransactionAttributeType.REQUIRED註解,因爲在我發送隊列中的消息之前需要執行一些「DB插入」,並使用這些消息讀取由製作者編寫的記錄。

問題是如果我定義一個JDBC非XA數據源,生產者將消息寫入隊列,但服務器抱怨本地資源(數據源本身我認爲)失敗的2階段提交,並且沒有調用MDB的onMessage方法。如果我定義一個JDBC XA,一切正常。

我的問題:

  • 是一個默認的XA資源所需的JMS會話?爲什麼?
  • 如果我將JMS連接工廠配置爲在JTA事務中創建非XA JMS會話,會發生什麼情況?這是一種不好的做法嗎?
  • 如果消費者開始消費消息,而生產者仍在數據庫上完成操作,會發生什麼?消費者是否會看到數據庫上的更改,因爲它們處於同一事務中?

在此先感謝,認爲

回答

1

是一個默認的XA資源所需的JMS會話?爲什麼?
您需要兩個資源都是XA。這是分佈式事務 - 在2個不同的資源中 - 數據庫和JMS隊列。要參與同一個交易,他們都必須是XA(在交易中有一個非XA資源的選項 - 使用最後一個參與者支持,但我不會建議這麼做)。

如果您的資源不是XA,那麼您可以將bean設置爲NOT_SUPPORTED並自行處理事務 - 意味着 - 管理2個單獨的事務,首先是數據庫,然後是管理JMS隊列。但是,由於數據庫事務將首先被提交,因此當發送消息失敗時(因爲無法回滾),您必須對其進行代碼補償,以避免數據庫狀態發生更改並且未發送消息的情況。

如果我將JMS連接工廠配置爲在JTA事務中創建非XA JMS會話,會發生什麼情況?
如果另一個資源是該事務的一部分(例如數據庫),那麼您將有2個階段提交支持的例外。

如果消費者開始消費消息,而生產者仍在數據庫上完成操作,會發生什麼?
我不明白,你在問什麼。如果生產者首先寫入數據庫,然後在一個XA事務中寫入隊列,它們將被同時提交,因此消費者將無法先看到消息。但是,如果您創建2個單獨的事務(一個用於數據庫訪問,另一個用於隊列訪問),則可能會出現這種情況,如果您首先提交隊列,則該用戶可能會讀取該消息。但是在這種情況下,如果沒有提交,消費者將無法看到數據庫的更改。

消費者是否會看到數據庫的變化,因爲它們在同一個事務中?
生產者和消費者不在同一個事務中(生產者創建消息和提交,消費者開始單獨的事務來閱讀)。