ビジネス・アクティビティー・アプリケーション・プログラミング・インターフェース (API) を使用して、アプリケーション・コンポーネントのビジネス・アクティビティーおよび補正ハンドラーを作成し、障害時のアクティビティーの補正に 必要なデータを記録します。
InitialContext ctx = new InitialContext(); UserBusinessActivity uba = (UserBusinessActivity) ctx.lookup(“java:comp/websphere/UserBusinessActivity”);
アプリケーション・コンポーネントが、障害時に補正を必要とする可能性がある作業を 実行中である場合、デプロイ済みアプリケーションの一部としてアセンブルされている補正ハンドラー・クラスを 提供する必要があります。この新規 Java クラスは、 com.ibm.websphere.wsba.CompensationHandler インターフェースを実装する必要があります。 これは、サービス・データ・オブジェクト (SDO) のパラメーターを取る close メソッド および compensate メソッドをサポートします。通常のアプリケーション処理中に、 アプリケーションは、setCompensationDataImmediate メソッドまたは setCompensationDataAtCommit メソッドに対して 1 つ以上の呼び出しを行い、実行される作業の現在の状態を表す SDO を引き渡すことができます。
ルート・ ビジネス・アクティビティーが関連する、基礎となる作業単位 (UOW) が完了すると、 すべての登録済み補正器は完了するように調整されます。完了の間に、 compensate または close のいずれかが 補正ハンドラー上で呼び出され、パラメーターとしてアプリケーション・コンポーネントによって記録された 最新の補正データを引き渡します。ご使用の補正ハンドラー実装は、 SDO DataObject に保管されているデータを認識できる必要があります。 補正ハンドラーは、このデータを使用して、エンタープライズ Bean が実行する作業の性質を決定し、 例えば、障害時にデータベース行に行った変更を元に戻すなど、適切な方法で 補正またはクローズできる必要があります。Rational Application Developer などの アセンブリー・ツールを使用して、補正ハンドラーと アプリケーション・コンポーネントを関連付けます。
ビジネス・アクティビティー範囲内で 補正が必要な可能性のあるコードを実行するアプリケーション・コンポーネントに対して、 CompensationHandler インターフェースを実装します。アプリケーションが UserBusinessActivity API を呼び出して 補正データを指定すると、CompensationHandler オブジェクトは、そのアプリケーションが実行している ビジネス・アクティビティー範囲で暗黙的に登録されます。 補正ハンドラーは、登録先のトランザクション UOW に応じて、 アクティブまたは非アクティブの 2 つの状態のいずれかにすることができます。 トランザクション UOW 内に登録される補正ハンドラーは最初、 トランザクションがコミットするまで非アクティブである場合があります。 この時点で、補正ハンドラーはアクティブになります (以下を参照してください)。トランザクション UOW の外側で 登録される補正ハンドラーは常に、即時にアクティブになります。
ビジネス・アクティビティーは完了すると、 アクティブな補正ハンドラーのみを駆動します。そのビジネス・アクティビティーに関連付けられている 非アクティブな補正ハンドラーは破棄され、駆動されることはありません。
ビジネス・アクティビティー API は、 アプリケーションが補正データを記録できるようにする 2 つのメソッドを指定します。 このデータは、ビジネス・アクティビティーが完了すると、処理中に 補正ハンドラーに対して使用可能になります。アプリケーションは、トランザクションを ビジネス・アクティビティーの一部とするのかどうかに応じて、これらのメソッドのいずれかを 呼び出します。
DataObject compensationData = doWorkWhichWouldNeedCompensating(); uba.setCompensationDataAtCommit(compensationData);
アプリケーションが、スレッド上でグローバル・トランザクションを期待しない場合は、 このメソッドを呼び出します。
setCompensationDataImmediate メソッドは、 メソッドが呼び出される時の現行 UOW コンテキストに関係なく、CompensationHandler インスタンスを 即時にアクティブにします。補正ハンドラーは、ビジネス・アクティビティーの完了中に、 常に参加することができます。
setCompensationDataImmediate メソッドの役割は、 非トランザクション作業 (言い換えれば、 グローバル・トランザクションの内側または外側のいずれかで実行できるが、 トランザクションによって管理されていない作業) を補正することです。例えば、 E メールの送信などです。ビジネス・アクティビティー内で障害が発生した場合、 この非トランザクション作業が常に補正されるように、補正ハンドラーは即時に アクティブにならなければなりません。
これらの 2 つの補正データ・ロギング・メソッドは、同じエンタープライズ Bean 内で 呼び出される場合には同じ CompensationHandler クラスを使用しますが、 実行時に 2 つの別個の CompensationHandler クラスのインスタンスを作成します。 そのため、メソッドのアクションは相互に排他的です。 メソッドの 1 つを呼び出しても、もう一方のメソッドによって実行される作業が上書きされることはありません。
パラメーターとして null を 渡すようなメソッドが 呼び出されたときに、CompensationHandler インスタンスが 同じメソッドによってビジネス・アクティビティーに 既に追加されている 場合、CompensationHandler インスタンスは、 そのビジネス・アクティビティーから除去され、 ビジネス・アクティブの完了時には クローズや補正が行われません。
前述したように、 補正データ・ロギング・メソッドが、ビジネス・アクティビティーを使用してエンタープライズ Bean によって はじめて呼び出されるときに、ビジネス・アクティビティー・サポートは そのビジネス・アクティビティーに CompensationHandler インスタンスを追加します。同時に、 J2EE コンテキストのスナップショットが取られ、補正データに記録されます。ビジネス・アクティビティーの 完了時に、ビジネス・アクティビティーに追加されたすべての補正ハンドラーは、 compensate または close に対して駆動されます。 CompensationHandler クラスにユーザーが作成するコードは、 それ以前のスナップショットで取り込まれた、 同じ J2EE コンテキストで実行できることが保証されています。