ビジネス・アクティビティー とは、タスクの結果が一致するように、一 緒にリンクされているタスクの集合です。 アトミック・トランザクションとは異なり、E メールの送信のようなアクティビティーは、 アトミックにロールバックすることが困難または不可能であるため、エラー発生時に補正処理が必要です。 WebSphere Application Server ビジネス・アクティビティー・サポートは、 ビジネス・アクティビティー有効範囲 を介してこの補正機能を提供します。
ビジネス・アクティビティー・コンテキストは、 アプリケーション・メッセージとともに伝搬します。 そのため、同じサーバー内で同じ場所に配置されていないアプリケーション・コンポーネント 間で分散することができます。 アトミック・トランザクション・コンテキストとは異なり、 ビジネス・アクティビティー・コンテキストは、同期 (ブロッキング) 呼び出し応答メッセージと非同期片方向メッセージの両方で伝搬します。 ビジネス・アクティビティー有効範囲で実行されるアプリケーション・コンポーネントは、コンポーネント独自の処 理が完了する前に、コンポーネントが開始した非同期作業が完了していることを確認する責任を負います。 応答不要送信メッセージ・パターンを使用して非同期作業を開始するアプリケーションでは、 ビジネス・アクティビティー有効範囲を使用できません。 これは、そのようなアプリケーションには、この非同期処理が完了したかどうかを検出する手段がないためです。
ビジネス・アクティビティー機能を使用できるのは、 コンテナー管理トランザクションが存在するエンタープライズ Bean だけです。 ビジネス・アクティビティー有効範囲を活用するエンタープライズ Bean は、 Web サービス・インターフェースを提供できますが、 標準エンタープライズ Bean のローカルまたはリモート Java インターフェースも提供できます。 ビジネス・アクティビティー・コンテキストは、標準の、相互運用可能な Web Services Business Activity CoordinationContext 要素を使用して、Web サービス・メッセージ内で伝搬します。 WebSphere Application Server は、 Web サービスが使用されていないときに、エンタープライズ Bean への RMI 呼び出しでも、ビジネス・アクティビティ ー・コンテキストを伝搬します。しかし、このような形式のコンテキストは、WebSphere Application Server 以外の 環境とは相互運用できません。 ビジネス内部でアプリケーションの補正が必要な場合は、この同種シナリオを使用することもあります。 異機種の環境でビジネス・アクティビティーの補正を使用する場合は、 アプリケーション・コンポーネントを Web サービスとして公開します。
ビジネス・アクティビティー・コンテキストは、ファイアウォール全体と WebSphere Application Server ドメイン外部に伝搬できます。 このような伝搬を実現するために使用するトポロジーは、 ビジネス・アクティビティー・トランザクションの高可用性および類縁性の振る舞いに影響することがあります。
ビジネス・アクティビティー有効範囲は、 WebSphere Application Server のコア作業単位 ( グローバル・トランザクション、アクティビティー・セッション、またはローカル・トランザクション内包 (LTC)) の有 効範囲です。 ビジネス・アクティビティー有効範囲は、新しい作業単位 (UOW) ではなく、 既存のコア UOW の属性です。 したがって、ビジネス・アクティビティー有効範囲と UOW の間には 1 対 1 の関係が存在します。
内部ビジネス・アクティビティー有効範囲は、外部ビジネス・アクティビティー有効範囲が完了する前に完了する必要があります。 内部ビジネス・アクティビティー有効範囲 (例えば 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 メソッドを使用して行うことができます。
トランザクション UOW 内部に登録されている補正ハンドラーは、 ビジネス・アクティビティー API から呼び出されるメソッドによっては、最初は非アクティブの場合があります。 この状態で非アクティブなハンドラーは、そのハンドラーが宣言されている UOW が正常に完了したときにアクティブになります。 トランザクション UOW の外部に登録されている補正ハンドラーは、常に即時にアクティブになります。 詳しくは、ビジネス・アクティビティー API を参照してください。
図に示すビジネス・アクティビティー有効範囲は、それぞれビジネス・アクティビティーを表します。 例えば、BAScope1 で実行されている外部ビジネス・アクティビティーは、 休暇の予約のシナリオで、BAScope2 はフライトの予約アクティビティー、BAScope3 はホテルの予約であるとします。 フライトまたはホテルの予約のいずれかが失敗すると、 デフォルトで休暇の予約全体も失敗します。 あるいは、例えば、フライトの予約が失敗した場合、 アプリケーションで、異なる航空会社を表す別のコンポーネントを使用して予約しようとすることもあります。 休暇の予約全体が失敗した場合、 アプリケーションは補正ハンドラーを使用して、すでに予約に成功したフライトやホテルを取り消します。