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