10.2.3. StateManager
JBoss Transaction Service クラスの
StateManagerは、オブジェクトステートを管理し、基本的なステート管理サポートメカニズムをすべて提供します。StateManager は、トランザクショナルオブジェクトが永続化、リカバリできるよう適切なリソースを作成、登録します。トランザクションがネスト化されると、StateManager はcommit フェーズ中に子トランザクションと親との間にあるこれらのリソースを伝播します。
JBoss Transaction Service のオブジェクトは、1)回復可能、2)永続的、3)回復可能で永続的、あるいは4)回復不可かつ永続的でないかとなっています。回復可能な場合、
StateManager がオブジェクトに関する適切なリカバリ情報を生成、管理しようとし、Input/OutputObjectStateクラスのインスタンスにその情報を格納します。これらのオブジェクトの有効期間は、これらのオブジェクトを作成したアプリケーションよりも短いものと仮定されています。回復可能かつ永続的なオブジェクトは、これらを作成したアプリケーションよりも寿命が長いため、StateManager はactivate か deactivateメソッドを呼び出すことで、オブジェクトの永続ステートをロードあるいはアンロードします。回復可能でも永続的でもないオブジェクトについては、ステートデータは何も保存されません。
オブジェクトが回復可能あるいは永続的である場合、
StateManager はdeactivation メソッド実行時にsave_state メソッドを呼び出します。activateメソッド実行中にrestore_stateが呼び出されます。また、アプリケーション実行中の様々な時点でtype が呼び出されます。StateManager は任意のJava オブジェクトレイアウトのランタイム詳細にアクセスできないため、プログラマはこれらのメソッドを実装する必要があります。しかし、InputObjectState と OutputObjectState が提供する機能により、これらのルーチンの記述が単純化されています。例えば、A、B、Cというメンバ変数を持つExampleクラスのsave_state 実装は、例10.5「save_state の例」に従っています。
例10.5 save_state の例
永続オブジェクトのクラッシュリカバリに対応するには、ユーザオブジェクトの
save_state と restore_state の全メソッドにより、super.save_state と super.restore_stateを呼び出す必要があります。
注記
type メソッドは、そのクラスインスタンスのステートを保存し最終的にリストアするオブジェクトストアの場所を決定します。これは有効なストリングであれば結構です。ただし、ハッシュ記号#は、JBoss Transaction Serviceで必要な特別ディレクトリ向けに確保されているため、#の利用を避けるようにしてください。
StateManagerのget_uid メソッドは、オブジェクトの内部システム名へ読み取り専用でアクセスできます。内部システム名の値はオブジェクト作成時に明示的なパラメータとして提供するか、新規識別子として生成することで設定可能なため、オブジェクト作成時にだけ設定できるようになっています。
destroyメソッドは、オブジェクトのステートをオブジェクトストアから削除します。これは、アトミックな操作で、呼出中のトランザクションがコミットされると状態のみが削除されます。プログラマは、この操作を呼び出す前にオブジェクトの排他的アクセスを確保していなければなりません。
オブジェクトのリカバリおよび永続性には補足要件があり、
StateManager クラスは1つのメカニズムで両方を管理するように組み合わせています。つまり、リカバリおよび永続化両方に対して、クラスのInput/OutputObjectState クラスインスタンスを使うのです。追加の引数をsave_state や restore_state 操作に渡すことで、プログラマは特定の呼出しの目的を判断することができ、リカバリや永続化するために様々な情報を保存することができます。