5. セッション管理¶
セッション管理の概要¶
IM-Propagation はデータの伝搬を行う際に、独自のセッション管理を行うことができます。セッション管理を使用すると、IM-Propagation を使用してデータを伝搬する前後の処理で、以下の管理を同時に行います。
- データベースのトランザクション管理
- 「受信側のデータ処理クラス(Procedure)」に処理成功・失敗を通知するためのライフサイクルの管理
IM-Propagation のセッションを開始すると、自動的にデータベースのトランザクションが開始されます。セッションを確定するとトランザクションがコミットされ、セッションを中断するとトランザクションがロールバックされます。また、データの受信側がデータベース以外(ファイルやメモリなど)の操作を行っている場合に、途中でロールバックなどの処理を行うため、通常使用する onReceive 以外のセッション管理用のメソッドが呼び出されます。通常、送信側は自身が送信するデータに対して、受信側がどのような処理を行うのかは予測できません。したがって、送信側では IM-Propagation のセッション管理を使用するよう実装してください。また、受信側では「データ処理クラス」で onReceive 以外のセッション管理用メソッドを実装してください。
送信側の対処¶
送信側で IM-Propagation のセッション管理を使用する場合は、PropagationManager#begin()、PropagationManager#decide()、および、PropagationManager#abort() メソッドを使用します。SampleData data = new SampleData("sample"); final PropagationManager manager = PropagationManagerFactory.getInstance().getPropagationManager(); try { manager.begin(); manager.send(OperationType.DATA_CREATED, SampleData.class, data, EmptyObject.class); manager.decide(); } finally { manager.abort(); }
まず最初に begin メソッドを呼び出して、セッションを開始します。 次に通常通り send メソッドを呼び出して、データを送信します。 最後に decide メソッドを呼び出して、セッションを確定して終了します。 例外が発生した際にセッションを中断して終了するため、 finally ブロックで abort メソッドを呼び出します。
受信側の対処¶
受信側で IM-Propagation のセッション管理を使用する場合は、「データ処理クラス」で AbstractProcedure クラスの代わりに AbstractSessionableProcedure クラスを継承します。AbstractSessionableProcedure クラスを継承することによって onReceive 以外のセッション管理用メソッドが IM-Propagation により呼び出され、各メソッド内でデータベース以外(ファイルやメモリなど)のコミット、および、ロールバック処理を行います。
図 セッション管理使用時の処理シーケンスIM-Propagation から呼び出されるメソッドの一覧は、以下の通りです。表 メソッド一覧
メソッド名 概要 使用例 onInitialize 初期化処理 データ受信前の初期化処理を行います。例えばファイルを操作する場合、変更対象のファイルを一時領域にコピーします。onReceive 受信処理 データの処理を行います。例えばファイルを操作する場合、一時領域のファイルを更新します。onPrepare 確定準備処理 セッションの確定を行う前の事前処理を行います。例えばファイルを操作する場合、変更対象のファイルをロックします。onDecide 確定処理 セッションの確定処理を行います。例えばファイルを操作する場合、一時領域のファイルの内容で、変更対象のファイルを更新後、ロックを解除します。onAbort 中断処理 セッションの中断処理を行います。例えばファイルを操作する場合、一時領域のファイルを削除して、変更対象のファイルのロックを解除します。注意
データベース以外の操作を行う場合は、全てのメソッドを処理して適切なセッション管理を独自に実装します。正しくセッション管理を行わない場合、データの不整合の原因となります。