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 サポートで変更される必要がありました。

EJB 仕様のこれまでのバージョンと同様に、資料「JSR 220: Enterprise JavaBeans™,Version 3.0 EJB Core Contracts and Requirements」のセクション 13.6.2.8 に、以下の内容が記載されています。

「(呼び出し元から継承されるトランザクションとは対照的に) ビジネス・メソッドをインスタンスにディスパッチする直前にコンテナーがトランザクションを開始した場合、コンテナーではこのインスタンスにより setRollbackOnly メソッドが呼び出されたことを認識する必要があります。ビジネス・メソッド呼び出しが完了したら、コンテナーはトランザクションをコミットするのではなく、トランザクションをロールバックする必要があります。 ビジネス・メソッドが適切に戻るか、またはアプリケーション例外が発生した場合、コンテナーはロールバックの実行後にメソッド実行結果またはアプリケーション例外をクライアントに渡す必要があります。」また、セクション 14.3.11 には次のような記述があります。「ただし、インスタンスによりその EJBContext オブジェクトに対して setRollbackOnly メソッドが呼び出されたためにコンテナーがトランザクションのロールバックを実行した場合は、コンテナーは javax.ejb.EJBException または java.rmi.RemoteException をスローしてはなりません。この場合、コンテナーはトランザクションをロールバックしてビジネス・メソッド結果またはビジネス・メソッドによりスローされたアプリケーション例外をクライアントに渡す必要があります。」

従来より、WebSphere Application Server では、仕様の上記のセクションを、setRollbackOnly の動作はトランザクションがそのトランザクションを開始したメソッド内で RollbackOnly としてマークされた場合にのみ適用される、という意味と解釈していました。ところが、EJB 3.0 仕様向けの Compatibility Test Suite によれば、RollbackOnly とマークされたトランザクションは上記の setRollbackOnly 動作を示す必要があり、このことは、トランザクションがそのトランザクションを開始したメソッド内で RollbackOnly とマークされたか、元の EJB メソッドから呼び出されたのと同じトランザクション内の別のメソッド内で RollbackOnly とマークされたかに関係はない、となっています。

この要件を説明するため、次の例で考えてみます。
  • アプリケーションが、Container Managed Transaction サポート TX_REQUIRED が指定されている EJB A に対してメソッド art を呼び出します。
  • コンテナーはトランザクションを開始し、このメソッドを呼び出します。
  • メソッド A.art() が、Container Managed Transaction サポート TX_REQUIRED が指定されている EJB B に対してメソッド bob を呼び出します。
  • B.bob() 内で、トランザクションに対して setRollbackOnly メソッドが呼び出され、完了します。

EJB 3.0 より前の動作: トランザクションは B.bob() メソッドで開始されないため、TranactionRolledbackException が A.art() および最終的にクライアント・アプリケーションにスローされます。

EJB 3.0 より後の動作: メソッド B.bob() は通常の方法でメソッド A.art() に戻ります。メソッド A.art() がトランザクションのロールバックを実行し、その結果をクライアントに戻します。このとき、EJB 仕様に示されているようにクライアント・アプリケーションに例外が戻されることはありません。

この処理により、以前のバージョンから 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 がこのセクションで前述した 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. OK」を選択します。
  11. 構成を保存します。
  12. サーバーを再始動します。

トピックのタイプを示すアイコン タスク・トピック



タイム・スタンプ・アイコン 最終更新: last_date
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=cord&product=was-nd-mp&topic=tejb_version_specific
ファイル名:tejb_version_specific.html