第20章 パーティシパント

20.1. 概要

パーティシパントはアプリケーションに関わるビジネスサービスの代わりにトランザクション管理に付随する作業を実行するエンティティです。Web サービス (サンプルコードでは劇場予約システム) には、座席の予約や空席紹介用のビジネスロジックがいくつか含まれていますが、永続的に情報を保持するものからのサポートが必要です。通常、これはデータベースですが、ファイルシステム、NVRAMや他のストレージメカニズムの場合があります。
サービスはバックエンドのデータベースと直接対話をする可能性がありますが、トランザクションが最終的にコミットやロールバックを制御しているため、変更のコミットややり直しはできません。トランザクションがこの制御を実行するには、データベースとやりとりを行う必要があります。図20.1「トランザクション、パーティシパント、バックエンドトランザクションの制御」にあるようにXTS ではパーティシパントがこのようなやりとりを行います。
トランザクション、パーティシパント、バックエンドトランザクションの制御

図20.1 トランザクション、パーティシパント、バックエンドトランザクションの制御

20.1.1. アトミックトランザクション

アトミックトランザクションのパーティシパントは「Durable2PCParticipant」あるいは 「Volatile2PCParticipant」のインスタンスです。

20.1.1.1. Durable2PCParticipant

Durable2PCParticipant は、com.arjuna.wst11.Durable2Participant に従い、Durable2PCParticipant 署名に掲載の署名でWS-ATomic Transaction Durable2PC プロトコルに対応しています。

Durable2PCParticipant 署名

prepare
パーティシパントは、トランザクションの範囲内でWeb サービスが実行する作業をコミットあるいはロールバックできるように必要な作業を実行する必要があります。この実装は、パーティシパントとコーディネータ間の暗黙的なコントラクトを達成するために、必要な事項を自由に行うことができます。
パーティシパントは、以下の3つの値の内いずれかを使い、com.arjuna.wst11.Voteのインスタンスを返すことでprepare可能かを示します。
  • ReadOnlyは、ステート情報を更新しなかったため、パーティシパントがトランザクションの結果について知る必要がないという意味です。
  • Preparedは、最終的なトランザクションの結果によりパーティシパントがコミットあるいはロールバックの準備ができていることを示しています。これを達成するために、十分な数のステートアップデートを永続化しています。
  • Abortedは、パーティシパントが中断され、トランザクションも中断を試行しているという意味です。
commit
パーティシパントは、作業を永続化する必要があります。これを達成する方法は各実装により変わってきます。たとえば、劇場の例ではチケットの予約がコミットされます。コミット処理が完了しないと、パーティシパントはSystemException エラーをスローしトランザクションがヒューリスティックな結果に陥ってしまう可能性もあります。
rollback
パーティシパントは作業をやり直す必要があります。ロールバック処理が完了できない場合はパーティシパントがSystemException エラーをスローしトランザクションがヒューリスティックな結果に陥ってしまう可能性もあります。
unknown
このメソッドは廃止予定となっており今後XTS から削除される予定です。
error
システムクラッシュから回復時まれに、以前に準備されたパーティシパントを完了あるいはロールバックできない場合があり、error 操作を呼び出します。

20.1.1.2. Volatile2PCParticipant

このパーティシパントは、com.arjuna.wst11.Volatile2Participantインターフェースに従い、Volatile2PCParticipant 署名に記載の署名でWS-ATomic Transaction Volatile2PC プロトコルに対応しています。

Volatile2PCParticipant 署名

prepare
パーティシパントは、トランザクションの範囲内でWeb サービス作成の揮発性データをシステムストアへフラッシュするのに必要な作業を実行する必要があります。この実装は、パーティシパントとコーディネータ間の暗黙的なコントラクトを達成するために、必要な事項を自由に行うことができます。
パーティシパントは、以下の3つの値の内いずれかを使い、com.arjuna.wst11.Voteのインスタンスを返すことでprepare可能かを示します。
  • ReadOnlyは、トランザクションの有効期間内でステートの情報に変更を加えられなかったため、パーティシパントはトランザクションの結果について知る必要がないと言う意味です。
  • Preparedは、パーティシパントは最終的なトランザクションの結果をcommitrollbackの呼出しで通知して欲しいという意味です。
  • Abortedは、パーティシパントが中断され、トランザクションも中断を試行しているという意味です。
commit
パーティシパントは、トランザクションのコミットに成功すると必要なクリーンアップアクティビティを実行する必要があります。これらのクリーンアップアクティビティは実装により左右されます。例えば、トランザクション中に変更されたデータのキャッシュバックアップはフラッシュされます。まれにコミット処理が完了できない時がありますがこういう場合は、パーティシパントはSystemException エラーをスローするはずです。これは、トランザクションの結果に影響を与えませんがエラーがログに残されることになります。コミット処理中にクラッシュが発生した場合、このメソッドは呼び出されない可能性があります。
rollback
パーティシパントは、トランザクションが中断されると、必要となるクリーンアップアクティビティを実行する必要があります。ロールバック処理が完了できないことがまれにありますが、こういう場合は、パーティシパントはSystemException エラーをスローするはずです。これはトランザクション結果に影響を与えませんがエラーがログに残されます。コミット処理中にクラッシュが発生した場合、このメソッドは呼び出されません。
unknown
このメソッドは廃止予定でXTSの今後のリリースからは削除されます。
error
揮発性のパーティシパントはリカバリ処理に関わらないため、このメソッドが呼ばれることはありません。

20.1.2. ビジネスアクティビティ

ビジネスアクティビティのパーティシパントは、「BusinessAgreementWithParticipantCompletion」 or 「BusinessAgreementWithCoordinatorCompletion」 で説明されているインターフェースのいずれかのインスタンスです。

20.1.2.1. BusinessAgreementWithParticipantCompletion

BusinessAgreementWithParticipantCompletion インターフェースは、com.arjuna.wst11.BusinessAgreementWithParticipantCompletionParticipantインターフェースに従い、BusinessAgreementWithParticipantCompletion 署名記載の署名でWS-Transactions BusinessAgreementWithParticipantCompletion プロトコルに対応しています。

BusinessAgreementWithParticipantCompletion 署名

close
トランザクションが問題なく完了しました。パーティシパントはすでに完了準備ができているとコーディネータに通知しています。
cancel
トランザクションは取り消され、パーティパントは作業をもとに戻す必要があります。パーティシパントはコーディネータに完了済みであると通知できていません。
compensate
トランザクションがキャンセルされました。パーティシパントはすでに作業は完了済みで必要であれば補正可能である旨をコーディネータに通知しており、この時点で依頼を投げます。補正が実行できない場合、パーティシパントは FaultedException エラーをスローし、当トランザクションに対しヒューリスティックな結果に陥る可能性があります。一時的な状況により補正処理が完了できない場合は、パーティシパントはSystemException エラーをスローしますが、補正アクションはキャンセルされ、トランザクションがヒューリスティックな結果で終了する可能性があります。
status
パーティシパントの状態を返します。
unknown
このメソッドは廃止予定で今後のXTSリリースでは削除される予定です。
error
システムクラッシュから回復する際にまれに、以前に完了したパーティシパントを補正できない場合があります。このような場合はerror 操作が呼び出されます。

20.1.2.2. BusinessAgreementWithCoordinatorCompletion

BusinessAgreementWithCoordinatorCompletion パーティシパントは、com.arjuna.wst11.BusinessAgreementWithCoordinatorCompletionParticipantインターフェースに従い、BusinessAgreementWithCoordinatorCompletion 署名に記載の署名でWS-Transactions BusinessAgreementWithCoordinatorCompletion プロトコルに対応しています。

BusinessAgreementWithCoordinatorCompletion 署名

close
トランザクションは問題なく完了しました。パーティシパントはすでに完了準備ができている旨をコーディネータに通知しています。
cancel
トランザクションがキャンセルされ、パーティシパントは作業のやり直しを行う必要があります。
compensate
トランザクションがキャンセルされました。パーティシパントは作業が完了しているが必要であれば補正を行える旨をコーディネータに通知済みで、補正を行うようリクエストをしています。まれに、補正が実行できない場合は、パーティシパントはFaultedExceptionエラーをスローし、トランザクションがヒューリスティックな結果に陥る可能性があります。一時的な状況で補正処理が完了しない場合、パーティシパントはSystemException エラーをスローする必要がありますが、この場合補正アクションがキャンセルされ、トランザクションがヒューリスティックな結果で終了してしまう可能性があります。
complete
コーディネータはパーティシパントに対し、ビジネスアクティビティの範囲内で行う必要のある全作業が完了し、一時的な変更を永続化すべきであると通知しています。
status
パーティシパントの状況を返します。
unknown
このメソッドは廃止予定でXTSの今後のリリースからは削除されます。
error
システムクラッシュから回復時まれに、以前に完了したパーティシパントの補正ができない場合があります。このような場合はerror メソッドが呼び出されます。

20.1.2.3. BAParticipantManager

Business Activity プロトコルを正常に機能させるには、パーティシパントが自発的にコーディネータに対して状況の変化について通知できなければなりません。トランザクションが終了した場合、コーディネータがコーディネータとパーティシパント間のインターラクションを開始させるAtomic Transaction プロトコルとは違い、BAParticipantManager インターラクションのパターンでは、ビジネスアクティビティが有効な間であればいつでもパーティシパントがコーディネータと対話できなければなりません。
パーティシパントがビジネスアクティビティに登録された場合は常に、コーディネータに対するハンドルを取得します。このハンドルは、BAParticipantManager メソッドに記載されているメソッドを持つcom.arjuna.wst11.BAParticipantManager インターフェースインスタンスです。

BAParticipantManager メソッド

exit
パーティシパントはexitメソッドを使い、アクティビティから離れていることをコーディネータに通知します。ビジネスアクティビティの終了時、終了方法については通知されます。このメソッドは、パーティシパントがactive な状態 (あるいはParticipantCompletionプロトコルに登録されているパーティシパントの場合はcompleting のステート)である間のみ、呼び出されます。パーティシパントがこれ以外の状態のときに呼び出されると、WrongStateException エラーがスローされます。exit はアクティビティ全体を終了あるいはキャンセル/補正できないようにするのではなく、離れたパーティシパントがアクティビティの完了、終了、補正に関わらないようにするだけです。
completed
パーティシパントの作業は完了しているが、アクティビティ終了時、終了方法が最終的に通知されるようにビジネスアクティビティを継続したい場合などです。パーティシパントは、完了した作業の補正を後に依頼される場合や、アクティビティの終了を知る場合があります。
fault
通常のアクティベーション時にパーティシパントにエラーが発生し、アクティビティの補正を試行しました。fault メソッドは、ビジネスアクティビティを強制的にcancel-only モードにします。障害のあるパーティシパントはアクティビティの完了、終了あるいは補正には関わらないようになります。