9.2.3. リカバリおよび永続性
StateManager
クラスはクラス階層のルート部分に存在し、オブジェクトの有効化、無効化、および回復を行います。例9.1「StateManager
実装」を参照してください。
例9.1 StateManager
実装
public abstract class StateManager { public boolean activate (); public boolean deactivate (boolean commit); public Uid get_uid (); // object’s identifier. // methods to be provided by a derived class public boolean restore_state (InputObjectState os); public boolean save_state (OutputObjectState os); protected StateManager (); protected StateManager (Uid id); };
オブジェクトは、1)回復可能、2) 回復可能および永続的あるいは、3)回復可能でも永続的でもないというように分類可能です。
- 回復可能
StateManager
は、オブジェクトに関する適切なリカバリ情報を生成、保持しようとします。このようなオブジェクトの有効期間は、オブジェクトを作成したアプリケーションの有効期間を越えないものとします。- 回復可能かつ永続的
- オブジェクトの有効期間は、そのオブジェクトを作成する、あるいはアクセスするアプリケーションの有効期限よりも長くなっています。リカバリ情報を保持するだけでなく、
StateManager
は、適時activate
あるいはdeactivate
操作を呼び出すことで、オブジェクトの既存ステートおよび永続ステートを自動的にload
あるいはunload
しようとします。 - 回復可能でも永続的でもない
- リカバリ情報は保持されず、オブジェクトの有効化、無効化も自動試行されません。
オブジェクトが回復可能、あるいは回復可能かつ永続的であれば、
StateManager
は、アプリケーション実行中の様々な時点に、deactivate
メソッド実行の一部としてsave_state
メソッドを呼び出し、activate
実行の一部としてrestore_state
を呼び出します。StateManager
はユーザーレベルのステート変更を検知することができないため、プログラマはこれらのメソッドを実装しなければなりません。そしてプログラマは、オブジェクトステートのどの部分を永続化するか決定します。例えば、スプレッドシートの場合、値を再計算できるのであれば、全エントリを保存する必要がありません。例9.2「save_state
の例」の例は、A、B、Cという整数のメンバ変数を含むExample
クラスのsave_state
実装について示しています。
例9.2 save_state
の例
public boolean save_state(OutputObjectState o) { if (!super.save_state(o)) return false; try { o.packInt(A); o.packInt(B); o.packInt(C)); } catch (Exception e) { return false; } return true; }
注記
クラッシュリカバリの仕組みに関する改善点を活用し、
save_state
と restore_state
メソッドはすべてsuper.save_state
および super.restore_state
を呼出す必要があります。