トランザクション補正およびビジネス・アクティビティー・サポート
ビジネス・アクティビティー とは、タスクの結果が一致するように、一 緒にリンクされているタスクの集合です。 アトミック・トランザクションとは異なり、E メールの送信のようなアクティビティーは、 アトミックにロールバックすることが困難または不可能であるため、エラー発生時に補正処理が必要です。 WebSphere® Application Server ビジネス・アクティビティー・サポートは、ビジネス・アクティビティー有効範囲 を介してこの補正機能を提供します。
ビジネス・アクティビティー・サポートを使用する場合
- アプリケーションが複数の拡張アーキテクチャー (XA) でないリソースを使用しています。
- アプリケーションが複数のアトミック・トランザクションを使用しています。 例えば、エンタープライズ Bean で、 コンテナー・トランザクション・デプロイメント記述子の「トランザクション」フィールドの設定が「新しい値が必要」になっている場合。
- アプリケーションがグローバル・トランザクションで実行されていません。

アプリケーション設計
ビジネス・アクティビティー・コンテキストは、 アプリケーション・メッセージとともに伝搬します。 そのため、同じサーバー内で同じ場所に配置されていないアプリケーション・コンポーネント 間で分散することができます。 アトミック・トランザクション・コンテキストとは異なり、 ビジネス・アクティビティー・コンテキストは、同期 (ブロッキング) 呼び出し応答メッセージと非同期片方向メッセージの両方で伝搬します。 ビジネス・アクティビティー有効範囲で実行されるアプリケーション・コンポーネントは、コンポーネント独自の処理が完了する前に、コンポーネントが開始した非同期作業が完了していることを確認する責任を負います。 応答不要送信メッセージ・パターンを使用して非同期作業を開始するアプリケーションでは、 ビジネス・アクティビティー有効範囲を使用できません。これは、そのようなアプリケーションには、この非同期処理が完了したかどうかを検出する手段がないためです。
ビジネス・アクティビティー機能を使用できるのは、コンテナー管理トランザクションが存在するエンタープライズ Bean だけです。ビジネス・アクティビティー有効範囲を活用するエンタープライズ Bean では、 Web サービス・インターフェースを提供できますが、標準エンタープライズ Bean のローカルまたはリモート Java™ インターフェースも提供できます。 ビジネス・アクティビティー・コンテキストは、標準の、相互運用可能な Web Services ビジネス・アクティビティー (WS-BA) CoordinationContext エレメントを使用して、Web サービス・メッセージ内で伝搬されます。WebSphere Application Server は、Web サービスが使用されていないときに、エンタープライズ Bean への RMI 呼び出しでも、ビジネス・アクティビティー・コンテキストを伝搬します。しかし、このような形式のコンテキストは、WebSphere Application Server 以外の環境とは相互運用できません。ビジネス内部でアプリケーションの補正が必要な場合は、この同種シナリオを使用することもあります。 異機種の環境でビジネス・アクティビティーの補正を使用する場合は、 アプリケーション・コンポーネントを Web サービスとして公開します。
ビジネス・アクティビティー・コンテキストは、ファイアウォール全体と WebSphere Application Server ドメイン外部に伝搬できます。このような伝搬を実現するために使用するトポロジーは、 ビジネス・アクティビティー・トランザクションの高可用性およびアフィニティーの振る舞いに影響することがあります。
アプリケーションの開発とデプロイメント
WebSphere Application Server は、ビジネス・アクティビティー有効範囲を作成し、補正ハンドラーとビジネス・アクティビティー有効範囲を関連付けるための、プログラミング・モデルを提供します。WebSphere Application Server は、補正データを指定し、ビジネス・アクティビティーの状況を検査したり、変更するための、アプリケーション・プログラミング・インターフェースも提供します。ビジネス・アクティビティー・サポートを使用するには、 特定のアプリケーション・デプロイメント記述子を適切に設定し、 必要に応じて補正ハンドラー・クラスを提供する必要があります。 さらに、アプリケーションを実行するサーバーでビジネス・アクティビティー・サポートを使用可能にする必要があります。ビジネス・アクティビティー有効範囲
ビジネス・アクティビティー有効範囲は、WebSphere Application Server のメイン作業単位 (グローバル・トランザクション、アクティビティー・セッション、またはローカル・トランザクション内包 (LTC)) の有効範囲です。ビジネス・アクティビティー有効範囲は、新しい作業単位 (UOW) ではなく、既存の主要 UOW の属性です。したがって、ビジネス・アクティビティー有効範囲と UOW の間には 1 対 1 の関係が存在します。
- UOW は、グローバル・トランザクションを作成するコンテナー管理のトランザクション (CMT) エンタープライズ Bean にすることができます。
- UOW は、ローカル・トランザクション内包 (LTC) にすることができます。この場合、コンテナーは、リソース・マネージャー・ローカル・トランザクション (RMLTs) の開始と終了を担います。 つまり、トランザクションのデプロイメント記述子の属性では、Local Transaction 属性 Resolver は、ContainerAtBoundary に設定する必要があります。 WS-BA を使用する場合、Resolver 属性を Application に設定することはできません。

内部ビジネス・アクティビティー有効範囲は、外部ビジネス・アクティビティー有効範囲が完了する前に完了する必要があります。 内部ビジネス・アクティビティー有効範囲 (例えば BAScope2) は、 外部ビジネス・アクティビティー有効範囲 (この場合は BAScope1) に関連しています。 各ビジネス・アクティビティー有効範囲は、関連した UOW が正常に終了した場合はクローズし、 関連した UOW が失敗した場合は補正するよう、指示されます。 BAScope2 が正常に完了すると、BAScope2 が所有するアクティブな補正ハンドラーは BAScope1 に移動し、 BAScope1 の完了指示と同じ方法 (補正またはクローズ) で指示されます。 BAScope2 が失敗すると、アクティブな補正ハンドラーは自動的に補正され、 外部の BAScope1 には何も移動しません。 関連した UOW が失敗した結果、内部ビジネス・アクティビティー有効範囲が失敗すると、 外部 UOW で実行されている呼び出し側アプリケーション・コンポーネントにアプリケーション・サーバー例外がスローされます。
例えば、内部 UOW が失敗すると、TransactionRolledBackException 例外がスローされる場合があります。 呼び出し側アプリケーションが、例えば、呼び出し先コンポーネントを再度試行したり、別のコンポーネントを呼び出したりすることによってこの例外を処理できる場合、呼び出し側 UOW と関連するビジネス・アクティビティー有効範囲は、内部ビジネス・アクティビティー有効範囲が失敗しても、正常に完了できます。 アプリケーション設計で呼び出し側 UOW が失敗し、 関連したビジネス・アクティビティー有効範囲を補正する必要がある場合、 呼び出し側アプリケーション・コンポーネントは、UOW を失敗させる必要があります。 これは、例えば、失敗した UOW からのシステム例外を、コンテナーで処理できるようにすることによって行います。
外部ビジネス・アクティビティー有効範囲が完了すると、それが正常に行われたか失敗したかによって、外部ビジネス・アクティビティー有効範囲が所有するアクティブな補正ハンドラーの完了指示 (クローズまたは補正) が決まります。これには、正常に完了した内部ビジネス・アクティビティー有効範囲によってプロモートされたものが含まれます。外部ビジネス・アクティビティー有効範囲は、正常に完了すると、すべてのアクティブな補正ハンドラーを強制的にクローズします。 外部ビジネス・アクティビティー有効範囲は、失敗すると、すべてのアクティブな補正ハンドラーに強制的に補正させます。
内部ビジネス・アクティビティー有効範囲 | 外部ビジネス・アクティビティー有効範囲 | 補正の振る舞い |
---|---|---|
成功 | 成功 | 内部ビジネス・アクティビティー有効範囲が所有する補正ハンドラーは、 外部 UOW の完了を待機します。 外部 UOW が成功すると、外部ビジネス・アクティビティー有効範囲はすべての補正ハンドラーを強制的にクローズします。 |
失敗 | 成功 | 内部ビジネス・アクティビティー有効範囲が所有するアクティブな補正ハンドラーは補正されます。 外部 UOW に例外がスローされます。 この例外がキャッチされると、外部 UOW が成功したときに、 外部ビジネス・アクティビティー有効範囲は残りのアクティブな補正ハンドラーをすべて強制的にクローズします。 |
失敗 | 失敗 | 内部ビジネス・アクティビティー有効範囲が所有するアクティブな補正ハンドラーは補正されます。 外部 UOW に例外がスローされます。 この例外がキャッチされない場合、外部ビジネス・アクティビティー有効範囲は失敗します。 未処理の例外または他の何らかの理由により、外部ビジネス・アクティビティー有効範囲が失敗すると、 残りのアクティブな補正ハンドラーは、すべて補正されます。 |
成功 | 失敗 | 内部ビジネス・アクティビティー有効範囲が所有する補正ハンドラーは、 外部 UOW の完了を待機します。 外部 UOW が失敗すると、外部ビジネス・アクティビティー有効範囲は、 すべての補正ハンドラーを強制的に補正させます。 |
関連したビジネス・アクティビティー有効範囲が存在する UOW が完了する場合、 ビジネス・アクティビティー有効範囲は、常に関連する UOW と同じ指示で完了します。 ビジネス・アクティビティー有効範囲の指示に影響を与えることができる唯一の方法は、 関連した UOW に影響を与えることです。 これは、ビジネス・アクティビティー API の setCompensateOnly メソッドを使用して行うことができます。
ビジネス・アクティビティー API から呼び出されるメソッドによっては、トランザクション UOW 内部に登録されている補正ハンドラーは、最初は非アクティブである場合があります。 この状態で非アクティブなハンドラーは、そのハンドラーが宣言されている UOW が正常に完了したときにアクティブになります。 トランザクション UOW の外部に登録されている補正ハンドラーは、常に即時にアクティブになります。 詳しくは、ビジネス・アクティビティー API のトピックを参照してください。
図に示すビジネス・アクティビティー有効範囲は、それぞれビジネス・アクティビティーを表します。 例えば、BAScope1 で実行されている外部ビジネス・アクティビティーは、 休暇の予約のシナリオで、BAScope2 はフライトの予約アクティビティー、BAScope3 はホテルの予約であるとします。 フライトまたはホテルの予約のいずれかが失敗すると、 デフォルトで休暇の予約全体も失敗します。 あるいは、例えば、フライトの予約が失敗した場合、アプリケーションで、異なる航空会社を表す別のコンポーネントを使用して予約しようとすることもあります。休暇の予約全体が失敗した場合、 アプリケーションは補正ハンドラーを使用して、既に予約に成功したフライトやホテルを取り消します。
アプリケーション・コンポーネントによるビジネス・アクティビティー有効範囲の使用
- デフォルト構成
- ビジネス・アクティビティー有効範囲が構成されていないコンポーネントが受信した要求に、 ビジネス・アクティビティー・コンテキストが存在する場合、 コンテキストはコンテナーによって保管されますが、ターゲット・コンポーネントのメソッド範囲で使用されることはありません。 新規のビジネス・アクティビティー有効範囲は、作成されません。 ターゲット・コンポーネントが別のコンポーネントを呼び出すと、 保管されたビジネス・アクティビティー・コンテキストが伝搬され、他の補正コンポーネントで使用可能になります。
- ビジネス・アクティビティー有効範囲でのエンタープライズ Bean メソッドの実行
- 着信要求にあるビジネス・アクティビティー・コンテキストは、 コンテナーによって受信され、ターゲット・コンポーネントで使用可能になります。 ターゲット・メソッド用に新規 UOW が作成される (例えば、 エンタープライズ Bean のメソッドで、「トランザクション」が「新しい値が必要」に設定されていることによって) 場合、 受信されたビジネス・アクティビティー有効範囲は、新規作成のビジネス・アクティビティーに対する外部ビジネス・アクティビティー有効範囲になります。 UOW が呼び出し側コンポーネントから伝搬され、 メソッドによって使用されると、受信されたビジネス・アクティビティー有効範囲はメソッドによって使用されます。 ビジネス・アクティビティー有効範囲が呼び出し上に存在しない場合、 新規ビジネス・アクティビティー有効範囲が作成され、メソッドによって使用されます。