將應用程式變更為 WebSphere 版本特定的 setRollbackOnly 行為

使用這項作業可讓 EJB 3.0 之後的應用程式展示 EJB 3.0 之前的行為,以及讓 EJB 3.0 之前的應用程式展示 EJB 3.0 之後的行為。 此作業中提供此處理行為的步驟是根據非常特定的處理實務範例,如「關於此作業」一節中所說明。

關於這項作業

處理實務範例: 此作業的基礎是下列處理實務範例。

呼叫 EJB 方法來啟動廣域交易。 在執行這個方法期間,會呼叫另一個 EJB 方法,它會在相同交易內繼續執行。 在執行這個方法期間,會呼叫 setRollbackOnly () 方法。 當發現這個實務時, EJB 規格會指定「EJB 儲存器」行為。 不過,在 WebSphere® Application Server for EJB 3.0 支援中需要變更此行為。

JSR 220: Enterprise JavaBeans™3.0 版 EJB 核心合約和需求 文件的 13.6.2.8 節,以及舊版 EJB 規格指出

如果儲存器在將商業方法分派給實例之前立即起始交易 (相對於繼承自呼叫程式的交易) ,儲存器必須注意該實例已呼叫 setRollbackOnly 方法。 當商業方法呼叫完成時,儲存器必須回復,而不是確定交易。 如果商業方法正常傳回或發生應用程式異常狀況,在儲存器執行回復之後,儲存器必須將方法結果或應用程式異常狀況傳遞給用戶端。 此外, 14.3.11 小節指出: 不過,儲存器不應擲出 javax.ejb.EJBException 或 java.rmi.RemoteException ,或者儲存器執行交易回復,因為實例已對其 EJBContext 物件呼叫 setRollbackOnly 方法。 在此情況下,儲存器必須回復交易,並將商業方法結果或商業方法所擲出的應用程式異常狀況傳遞給用戶端。

在歷程上, WebSphere Application Server 已解譯規格的先前各節,以規定只有在開始交易的方法內,將交易標示為 RollbackOnly 時,才應套用 setRollbackOnly 行為。 不過, EJB 3.0 規格的相容性測試套組要求標示為 RollbackOnly 的交易必須展現給定的 setRollbackOnly 行為,不論交易是在開始交易的方法內,還是在從原始 EJB 方法呼叫的相同交易內的另一個方法內標示為 RollbackOnly。

若要說明此需求,請考量下列範例:
  • 應用程式在 EJB A 上使用「儲存器管理交易」支援 TX_REQUIRED 來呼叫方法 art
  • 儲存器會開始交易並呼叫方法。
  • A.art() 方法在 EJB B 上呼叫 bob方法,並支援「儲存器管理交易」TX_REQUIRED。
  • B.bob() 內,會對交易呼叫 setRollbackOnly 方法,然後完成。

EJB 3.0 之前的行為: 由於未使用 B.bob() 方法來起始交易,因此會將 TransactionRolledbackException 擲出至 A.art() ,最後再擲出至用戶端應用程式。

EJB 3.0 及以上版本中引進的行為: 方法 B.bob() 會正常回到方法 A.art()。 如 EJB 規格所指示,方法 A.art() 會對交易執行回復,並將結果傳回至用戶端,而不會將異常狀況擲出至用戶端應用程式。

由於此處理程序會針對從舊版移轉至 EJB 3.0 或更新版本的應用程式,在行為中引進變更,因此下列 JVM 系統內容可用來變更此行為,以符合您的需求:
  • com.ibm.websphere.ejbcontainer.limitSetRollbackOnlyBehaviorToInstanceFor : 這個內容可讓使用者指定應用程式名稱,以便讓 EJB 3.0 模組中的 EJB 示範本節先前說明的 EJB 3.0 之前的 setRollbackOnly 行為。
  • com.ibm.websphere.ejbcontainer.extendSetRollbackOnlyBehaviorBeyondInstanceFor : 這個內容可讓使用者指定應用程式名稱,以便在其 EJB 3.0 之前的模組中,示範本節先前說明的 EJB 3.0 setRollbackOnly 行為。
這些內容的值會設為需要示範所需行為的應用程式名稱 (appName1:appName2:appName3)。

程序

  1. 開啟管理主控台。
  2. 選取 伺服器
  3. 選取 伺服器類型
  4. 選取 WebSphere Application Server
  5. 選取您要配置的伺服器。
  6. 在伺服器基礎架構下,選取 Java 及處理程序管理> 處理程序定義
  7. 在「其他內容」之下,選取 Java 虛擬機器> 自訂內容> 新建
  8. 名稱 輸入欄位中,輸入 JVM 系統內容。

    com.ibm.websphere.ejbcontainer.limitSetRollbackOnlyBehaviorToInstanceFor

    com.ibm.websphere.ejbcontainer.extendSetRollbackOnlyBehaviorBeyondInstanceFor

  9. 輸入欄位中,鍵入 (appName1:appName2:appName3....)。
    行為應該套用的應用程式名稱。
  10. 選取 確定
  11. 儲存配置。
  12. 重新啟動伺服器。