10.2.3. StateManager

JBoss Transaction Service クラスのStateManagerは、オブジェクトステートを管理し、基本的なステート管理サポートメカニズムをすべて提供します。StateManager は、トランザクショナルオブジェクトが永続化、リカバリできるよう適切なリソースを作成、登録します。トランザクションがネスト化されると、StateManagercommit フェーズ中に子トランザクションと親との間にあるこれらのリソースを伝播します。
JBoss Transaction Service のオブジェクトは、1)回復可能、2)永続的、3)回復可能で永続的、あるいは4)回復不可かつ永続的でないかとなっています。回復可能な場合、StateManager がオブジェクトに関する適切なリカバリ情報を生成、管理しようとし、Input/OutputObjectStateクラスのインスタンスにその情報を格納します。これらのオブジェクトの有効期間は、これらのオブジェクトを作成したアプリケーションよりも短いものと仮定されています。回復可能かつ永続的なオブジェクトは、これらを作成したアプリケーションよりも寿命が長いため、StateManageractivatedeactivateメソッドを呼び出すことで、オブジェクトの永続ステートをロードあるいはアンロードします。回復可能でも永続的でもないオブジェクトについては、ステートデータは何も保存されません。
public class ObjectStatus
{
    public static final int PASSIVE;
    public static final int PASSIVE_NEW;
    public static final int ACTIVE;
    public static final int ACTIVE_NEW;
    public static final int UNKNOWN_STATUS;
};

public class ObjectType
{
    public static final int RECOVERABLE;
    public static final int ANDPERSISTENT;
    public static final int NEITHER;
};

public abstract class StateManager
{
    public synchronized boolean activate ();
    public synchronized boolean activate (String storeRoot);
    public synchronized boolean deactivate ();
    public synchronized boolean deactivate (String storeRoot, boolean commit);
      
    public synchronized void destroy ();
      
    public final Uid get_uid ();
      
    public boolean restore_state (InputObjectState, int ObjectType);
    public boolean save_state (OutputObjectState, int ObjectType);
    public String type ();
    . . .
      
	protected StateManager ();
    protected StateManager (int ObjectType, ObjectName attr);
    protected StateManager (Uid uid);
    protected StateManager (Uid uid, ObjectName attr);
    . . .
      
	protected final void modified ();
    . . .
};

public class ObjectModel
{
    public static final int SINGLE;
    public static final int MULTIPLE;
};
オブジェクトが回復可能あるいは永続的である場合、StateManagerdeactivation メソッド実行時にsave_state メソッドを呼び出します。activateメソッド実行中にrestore_stateが呼び出されます。また、アプリケーション実行中の様々な時点でtype が呼び出されます。StateManager は任意のJava オブジェクトレイアウトのランタイム詳細にアクセスできないため、プログラマはこれらのメソッドを実装する必要があります。しかし、InputObjectStateOutputObjectState が提供する機能により、これらのルーチンの記述が単純化されています。例えば、A、B、Cというメンバ変数を持つExampleクラスのsave_state 実装は、例10.5「save_state の例」に従っています。

例10.5 save_state の例

public boolean save_state ( OutputObjectState os, int ObjectType )
{
    if (!super.save_state(os, ObjectType))
	return false;
      
    try
	{
	    os.packInt(A);
	    os.packString(B);
	    os.packFloat(C);
      
	    return true;
	}
    catch (IOException e)
	{
	    return false;
	}
}
永続オブジェクトのクラッシュリカバリに対応するには、ユーザオブジェクトのsave_staterestore_state の全メソッドにより、super.save_statesuper.restore_stateを呼び出す必要があります。

注記

type メソッドは、そのクラスインスタンスのステートを保存し最終的にリストアするオブジェクトストアの場所を決定します。これは有効なストリングであれば結構です。ただし、ハッシュ記号#は、JBoss Transaction Serviceで必要な特別ディレクトリ向けに確保されているため、#の利用を避けるようにしてください。
StateManagerget_uid メソッドは、オブジェクトの内部システム名へ読み取り専用でアクセスできます。内部システム名の値はオブジェクト作成時に明示的なパラメータとして提供するか、新規識別子として生成することで設定可能なため、オブジェクト作成時にだけ設定できるようになっています。
destroyメソッドは、オブジェクトのステートをオブジェクトストアから削除します。これは、アトミックな操作で、呼出中のトランザクションがコミットされると状態のみが削除されます。プログラマは、この操作を呼び出す前にオブジェクトの排他的アクセスを確保していなければなりません。
オブジェクトのリカバリおよび永続性には補足要件があり、StateManager クラスは1つのメカニズムで両方を管理するように組み合わせています。つまり、リカバリおよび永続化両方に対して、クラスのInput/OutputObjectState クラスインスタンスを使うのです。追加の引数をsave_staterestore_state 操作に渡すことで、プログラマは特定の呼出しの目的を判断することができ、リカバリや永続化するために様々な情報を保存することができます。