| 目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
RMI 起動プロトコルでは、システムの正常な動作のため、アクティベータに関して守るべき次の 2 つの約束事があります。
アクティベータは、起動処理に関与するグループとオブジェクトに対する適切な情報のデータベースを保持します。
Activator インタフェース
アクティベータは、起動プロセス中に関与するエンティティの 1 つです。前述したように、フォルト参照 (スタブ内) は、起動可能リモートオブジェクトへの「ライブ」参照を取得するため、アクティベータのactivateメソッドを呼び出します。アクティベータは、起動要求を受け取ると、指定された起動識別子 id に対応する起動記述子を探し、そのオブジェクトを起動すべきグループを特定して、その起動グループのインスタンシエータのnewInstanceメソッドを呼び出します (リモートインタフェースActivationGroupについては後述)。必要であれば、アクティベータは起動グループの実行を開始します。たとえば、特定のグループ記述子に対応する起動グループがまだ実行されていない場合、アクティベータはその起動グループの子 JVM を生成し、生成した JVM 内で起動グループを立ち上げます。アクティベータは、起動グループのエラーを監視、検出し、エラーの際は、その内部テーブルから古いリモート参照を削除します。
package java.rmi.activation;public interface Activator extends java.rmi.Remote { java.rmi.MarshalledObject activate(ActivationID id, boolean force) throws UnknownObjectException, ActivationException, java.rmi.RemoteException; }
activateメソッドは、起動識別子 id に関連付けられたオブジェクトを起動します。そのオブジェクトがすでにアクティブな状態にあることをアクティベータが知っており、なおかつ force パラメータが false の場合は、スタブが「ライブ」参照とともにただちに呼び出し側に返されます。一方、対応するリモートオブジェクトがアクティブな状態にあることをアクティベータが知らないか、force パラメータがtrueの場合は、アクティベータは起動記述子情報 (前に id を取得するため登録したもの) を使用して、オブジェクトを起動すべきグループ (JVM) を特定します。特定したオブジェクトのグループに対応するActivationInstantiatorがすでに存在する場合は、アクティベータは起動インスタンシエータのnewInstanceメソッドを呼び出し、オブジェクトの id と起動記述子を引数として渡します。特定したオブジェクトのグループ記述子に対応する起動インスタンシエータまたはグループがまだ存在しない場合は、アクティベータは、子プロセスを生成するなどの方法により
ActivationInstantiatorの実行の新規生成を開始させます。アクティベータは、特定のグループのActivationInstantiatorを再作成するときは、そのグループの生成番号をインクリメントしなければなりません。生成番号はゼロから始まります。起動システムは、生成番号により、新しいActivationSystem.activeGroupおよびActivationMonitor.inactiveGroupの呼び出しを検出します。同じグループで、現在の生成番号よりも若い生成番号を持つ呼び出しは破棄されます。
注 - 新しい起動グループを実行するときは、アクティベータは起動グループの識別子、記述子、および生成番号を利用しなければなりません。アクティベータは、独立した JVM 内 (たとえば、別のプロセスや子プロセスとして) で起動グループを生成します。したがって、アクティベータは、ActivationGroup.createGroupメソッドで起動グループを作成するのに必要な情報を引き渡す必要があります。この情報を生成されたプロセスにどのように引き渡すかについては規定されていませんが、整列化されたオブジェクトの形式で子プロセスの「標準入力」に送ることが可能です。
アクティベータは、ActivationSystem.activeGroupメソッドにより起動グループの参照と生成番号が含まれる起動グループのコールバックを受け取ると、その起動インスタンシエータのnewInstanceメソッドを呼び出して、保留状態になっている起動要求を起動インスタンシエータに転送し、結果 (「整列化された」リモートオブジェクトの参照、つまりスタブ) をそれぞれの呼び出し側に返すことができます。アクティベータは、
RemoteオブジェクトではなくMarshalledObjectを受け取ることによって、オブジェクトのコードのロードやオブジェクトの分散ガベージコレクションへの関与の必要性をなくしています。リモートオブジェクトへの強い参照を保持していれば、通常の分散ガベージコレクション機構の下では、アクティベータはリモートオブジェクトがガベージコレクトされるのを防ぐことができます。起動が失敗した場合、
activateメソッドはActivationExceptionをスローします。起動が失敗する原因としては、クラスが見つからない、起動グループにアクセスできないなど、さまざまな要因があります。指定された起動識別子 id に対応する起動記述子がこのアクティベータで登録されていない場合は、activateメソッドはUnknownObjectExceptionをスローします。アクティベータのリモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
ActivationSystem インタフェース
ActivationSystemは、グループと、そのグループ内で起動させる「起動可能」オブジェクトを登録する手段を提供します。ActivationSystemは、ActivationSystemで登録されたオブジェクトを起動するActivatorと、アクティブなオブジェクトや、アクティブでないオブジェクト、またはアクティブでないグループに関する情報を取得するActivationMonitorの双方と密接に関連しながら動作します。
package java.rmi.activation;public interface ActivationSystem extends java.rmi.Remote { public static final int SYSTEM_PORT = 1098; ActivationGroupID registerGroup(ActivationGroupDesc desc) throws ActivationException, java.rmi.RemoteException; ActivationMonitor activeGroup(ActivationGroupID id, ActivationInstantiator group, long incarnation) throws UnknownGroupException, ActivationException, java.rmi.RemoteException; void unregisterGroup(ActivationGroupID id) throws ActivationException, UnknownGroupException, java.rmi.RemoteException; ActivationID registerObject(ActivationDesc desc) throws ActivationException, UnknownGroupException, java.rmi.RemoteException; void unregisterObject(ActivationID id) throws ActivationException, UnknownObjectException, java.rmi.RemoteException; void shutdown() throws java.rmi.RemoteException; }
注 - セキュリティ保護のため、上記のすべてのメソッド (registerGroup、activeGroup、unregisterGroup、registerObject、unregisterObject、およびshutdown) は、起動システムとは異なるホスト上で動作しているクライアントから呼び出された場合、java.rmi.RemoteExceptionのサブクラスであるjava.rmi.AccessExceptionをスローします。
registerObjectメソッドは、起動記述子 desc の登録と、起動可能リモートオブジェクトの起動識別子の取得に使用します。ActivationSystemは、起動記述子 desc で指定されたオブジェクトのActivationID(起動識別子) を作成し、後の使用に備えて起動記述子と、それに関連付けられた識別子を安定記憶領域に記録します。Activatorは、特定の識別子を対象としたactivate要求を受け取ると、指定された識別子に対応する起動記述子 (前に登録したもの) を探し、その情報を使用してオブジェクトを起動します。desc で参照されているグループがこのシステムに登録されていない場合は、registerObjectメソッドはUnknownGroupExceptionをスローします。データベースの更新の失敗などが原因で登録が失敗した場合は、ActivationExceptionをスローします。リモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
unregisterObjectは、起動識別子 id と、それに関連付けられ、ActivationSystemに登録されている記述子を削除します。呼び出し完了後は、オブジェクトはその起動 id では起動できなくなります。指定されたオブジェクト id が起動システムに認識されない (登録されていない) 識別子である場合は、unregisterObjectメソッドはUnknownObjectExceptionをスローします。データベース更新の失敗などが原因で登録解除処理が失敗した場合は、ActivationExceptionをスローします。リモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
registerGroupメソッドは、グループ記述子 desc で指定された起動グループを起動システムに登録し、そのグループに割り当てられたActivationGroupIDを返します。オブジェクトを起動グループに登録する前に、その起動グループをActivationSystemに登録しておく必要があります。グループの登録が失敗した場合は、このメソッドはActivationExceptionをスローします。リモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
activeGroupメソッドは、ActivationGroupからのコールバック (識別子 id を伴う) であり、group が現在アクティブな状態にあり、その JVM のActivationInstantiatorになっていることを起動システムに知らせます。このメソッドは、そのグループ内のグループまたはオブジェクトがアクティブでなくなったなど、オブジェクトとグループの状態の変化をシステムに伝えるためにグループが使用するActivationMonitorを取得するため、ActivationGroup.createGroupメソッドにより内部的に呼び出されます。指定されたグループが登録されていない場合は、activeGroupメソッドはUnknownGroupExceptionをスローします。指定されたグループがすでにアクティブな状態にある場合は、ActivationExceptionをスローします。起動システムのリモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
unregisterGroupメソッドは、指定された識別子 id を持つ起動グループを起動システムから削除します。起動グループは、自分自身を破棄すべきであることをアクティベータに伝えるため、このコールバックを行います。この呼び出しが成功した場合は、そのグループにオブジェクトを登録したり、そのグループ内でオブジェクトを起動したりすることはできなくなります。そのグループに関する情報と、そのグループに関連付けられたオブジェクトはすべてシステムから削除されます。指定されたグループが登録されていない場合は、このメソッドはUnknownGroupExceptionをスローします。リモート呼び出しが失敗した場合は、RemoteExceptionをスローします。データベースの更新の失敗などが原因で登録解除に失敗した場合は、ActivationExceptionをスローします。
shutdownメソッドは、起動システムおよび関連するすべての起動プロセス (アクティベータ、モニタ、グループ) を正常に (非同期に) 終了させます。起動デー
rmid -stop [-port num]
このコマンドにより、指定されたポートで起動デーモンがシャットダウンされます。ポートを指定しない場合、デフォルトポート上のデーモンがシャットダウンされます。
ActivationMonitor クラス
ActivationMonitorはActivationGroupに固有のクラスで、ActivationSystem.activeGroupの呼び出し (ActivationGroup.createGroupメソッドにより内部的に呼び出される) によりグループの報告が行われたときに取得されます。以下の場合には、起動グループは、ActivationMonitorに報告する必要があります。
package java.rmi.activation;public interface ActivationMonitor extends java.rmi.Remote { public abstract void inactiveObject(ActivationID id) throws UnknownObjectException, RemoteException; public void activeObject(ActivationID id, java.rmi.MarshalledObject mobj) throws UnknownObjectException, java.rmi.RemoteException; public void inactiveGroup(ActivationGroupID id, long incarnation) throws UnknownGroupException, java.rmi.RemoteException; }
起動グループは、そのモニタのinactiveObjectメソッドを、グループ内のオブジェクトがアクティブでなくなったときに呼び出します。起動グループは、起動グループのinactiveObjectメソッドの呼び出しにより、その JVM 内のオブジェクト (グループがその起動にかかわったオブジェクト) がアクティブでなくなったことを検出します。
inactiveObject呼び出しは、起動識別子 id を持つオブジェクトを指すリモートオブジェクト参照が有効でなくなったことをActivationMonitorに知らせます。これにより、モニタは id に関連付けられた参照が古い参照であると見なします。この参照は古い参照であると見なされるため、それ以降、同じ起動識別子を指定してactivateを呼び出すと、リモートオブジェクトは再度起動されます。指定されたオブジェクトがActivationMonitorに認識されないオブジェクトである場合は、inactiveObjectメソッドはUnknownObjectExceptionをスローします。リモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
activeObjectは、id に関連付けられたオブジェクトが現在アクティブな状態にあることをActivationMonitorに知らせます。パラメータ obj には、オブジェクトの整列化された形式のスタブを指定します。ActivationGroupは、グループ内のオブジェクトがシステムにより直接起動される以外の方法でアクティブになった場合 (オブジェクトが自分自身で登録して起動した場合など) は、それをモニタに知らせなければなりません。指定されたオブジェクト id が登録されていない場合は、activeObjectはUnknownObjectExceptionをスローします。リモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
inactiveGroupは、id と incarnation で指定されたグループが現在アクティブでないことをモニタに知らせます。グループ内のオブジェクトを起動する要求がそれ以降発生すると、グループはより大きな生成番号で再作成されます。グループ内のすべてのオブジェクトが、自分がアクティブでなくなったことを報告すると、グループはアクティブでなくなります。指定されたグループ id が登録されていないか、指定された生成番号がグループの現在の生成番号よりも小さい場合は、inactiveGroupメソッドはUnknownGroupExceptionをスローします。リモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
ActivationInstantiator クラス
ActivationInstantiatorは、起動可能オブジェクトのインスタンスを生成する役割を持ちます。ActivationGroupの具象サブクラスでは、グループ内でのオブジェクトの作成を処理するためnewInstanceを実装しています。
package java.rmi.activation;public interface ActivationInstantiator extends java.rmi.Remote { public MarshalledObject newInstance(ActivationID id, ActivationDesc desc) throws ActivationException, java.rmi.RemoteException; }
アクティベータは、起動識別子 id と起動記述子 desc を持つオブジェクトをグループ内に再作成するため、インスタンシエータのnewInstanceメソッドを呼び出します。インスタンシエータは、次のような役割を持ちます。
また、インスタンシエータは、適切なinactiveObjectを呼び出せるように、作成または起動したオブジェクトがアクティブでなくなったことをそのActivationMonitorに報告する役割も持ちます (詳細はActivationGroupクラスを参照)。オブジェクトの起動が失敗した場合は、newInstance メソッドは
ActivationExceptionをスローします。リモート呼び出しが失敗した場合は、RemoteExceptionをスローします。
ActivationGroupDesc クラス
起動グループ記述子 (ActivationGroupDesc) には、同じ JVM 内でオブジェクトを起動する起動グループを作成または再作成するのに必要な情報が含まれます。
グループのクラスは、ActivationGroupの具象サブクラスでなければなりません。ActivationGroupのサブクラスは、次の 2 つの引数をとる特別なコンストラクタを呼び出す static メソッドActivationGroup.createGroupにより作成または再作成されます。
package java.rmi.activation;public final class ActivationGroupDesc implements java.io.Serializable { public ActivationGroupDesc(java.util.Properties props, CommandEnvironment env);; public ActivationGroupDesc(String className, String codebase, java.rmi.MarshalledObject data, java.util.Properties props, CommandEnvironment env); public String getClassName(); public String getLocation(); public java.rmi.MarshalledObject getData(); public CommandEnvironment getCommandEnvironment(); public java.util.Properties getPropertiesOverrides(); }
1 つ目のコンストラクタは、グループの実装とコード位置としてシステムのデフォルト値を使用するグループ記述子を作成します。プロパティは、Java アプリケーション環境のオーバーライド (グループ実装の JVM 内のシステムプロパティをオーバーライドする) を指定します。コマンド環境では、子 JVM の起動に使用される正確なコマンドやオプションを制御するか、またはnullを設定してrmidのデフォルトを受け入れることが可能です。このコンストラクタは、グループクラス名nullを使ってActivationGroupDescを作成します。グループクラス名nullは、システムのデフォルトであるActivationGroup実装を表します。2 番目のコンストラクタは最初と同じですが、
PropertiesおよびCommandEnvironmentを指定できるようになっています。
getClassNameメソッドは、グループのクラス名 (nullの場合が多い) を返します。グループクラス名nullは、システムのデフォルトであるActivationGroup実装を表します。
getLocationメソッドは、グループのクラスのロード元となるコードベースパスを返します。
getDataメソッドは、整列化された形式のグループの初期化データを返します。
getCommandEnvironmentメソッドは、コマンド環境 (nullの場合が多い) を返します。
getPropertiesOverridesメソッドは、この記述子のプロパティオーバーライド (nullの場合が多い) を返します。
ActivationGroupDesc.CommandEnvironment クラス
CommandEnvironmentクラスを使用すると、デフォルトのシステムプロパティのオーバーライド、および実装で定義されたActivationGroupのオプション指定が可能になります。
public static class CommandEnvironment
implements java.io.Serializable
{
public CommandEnvironment(String cmdpath, String[] args);
public boolean equals(java.lang.Object);
public String[] getCommandOptions();
public String getCommandPath();
public int hashCode();
}
コンストラクタは、指定されたコマンド、cmdpath、および追加コマンド行オプション args を使ってCommandEnvironmentを作成します。
equalsは、コマンド環境オブジェクトに等しい内容を実装します。必要に応じてCommandEnvironmentがハッシュテーブルに格納されるように、hashCodeメソッドが適宜に実装されます。
getCommandOptionsメソッドは、環境オブジェクトのコマンド行オプションを返します。
getCommandPathメソッドは、環境オブジェクトのコマンド文字列を返します。
ActivationGroupID クラス
登録された起動グループの識別子は、次のような役割を持ちます。
ActivationGroupIDは、ActivationSystem.registerGroupを呼び出すことで取得でき、起動システム内でのグループの識別に使用されます。このグループ識別子は、起動グループの作成または再作成時に、起動グループの特別なコンストラクタに引数として引き渡すことができます。
package java.rmi.activation;public class ActivationGroupID implements java.io.Serializable { public ActivationGroupID(ActivationSystem system); public ActivationSystem getSystem(); public boolean equals(Object obj); public int hashCode(); }
ActivationGroupIDのコンストラクタは、ActivationSystem が system で指定された一意のグループ識別子を作成します。
getSystemメソッドは、グループの起動システムを返します。
hashCodeメソッドは、グループの識別子のハッシュコードを返します。同じリモートグループを参照する 2 つのグループ識別子は、同じハッシュコードを持ちます。
equalsメソッドは、2 つのグループ識別子を比較して、内容が等しいかどうかを調べます。このメソッドは、1) 一意の識別子が内容的に同一であり、なおかつ、2) それぞれの識別子で指定された起動システムが同一のリモートオブジェクトを参照している場合は、trueを返します。
ActivationGroup クラス
ActivationGroupは、そのグループ内に「起動可能」オブジェクトの新しいインスタンスを生成し、次の場合にActivationMonitorに通知します。
ActivationGroupが「最初に」作成されるのは、次のいずれかの場合です。
ActivationGroupを「再作成」できるのはアクティベータだけです。アクティベータは、登録されている起動グループごとに、必要に応じて独立した JVM (たとえば、子プロセスとして) を生成し、起動要求を適切なグループに転送します。JVM をどのように生成するかは、実装に任せられます。起動グループは、static メソッドActivationGroup.createGroupにより作成します。createGroupメソッドには、作成するグループに関して、1) グループはActivationGroupの具象サブクラスでなければならない、2) グループは次の 2 つの引数をとるコンストラクタを持っていなければならない、という決まりがあります。
作成時、ActivationGroupのデフォルトの実装では、システムプロパティはActivationGroupDescが作成されたときのシステムプロパティ値に設定され、セキュリティマネージャはjava.rmi.RMISecurityManagerに設定されます。グループ内でオブジェクトが起動されるときに、いくつかのプロパティについては独自の値を設定したい場合は、任意のActivationDescが作成される前、つまり、デフォルトのActivationGroupDescが作成される前に設定するようにすべきです。
package java.rmi.activation;public abstract class ActivationGroup extends UnicastRemoteObject implements ActivationInstantiator { protected ActivationGroup(ActivationGroupID groupID) throws java.rmi.RemoteException; public abstract MarshalledObject newInstance(ActivationID id, ActivationDesc desc) throws ActivationException, java.rmi.RemoteException; public abstract boolean inactiveObject(ActivationID id) throws ActivationException, UnknownObjectException, java.rmi.RemoteException; public static ActivationGroup createGroup(ActivationGroupID id, ActivationGroupDesc desc, long incarnation) throws ActivationException; public static ActivationGroupID currentGroupID(); public static void setSystem(ActivationSystem system) throws ActivationException; public static ActivationSystem getSystem() throws ActivationException; protected void activeObject(ActivationID id, java.rmi.MarshalledObject mobj) throws ActivationException, UnknownObjectException, java.rmi.RemoteException; protected void inactiveGroup() throws UnknownGroupException, java.rmi.RemoteException; }
アクティベータは、起動記述子 desc を持つオブジェクトを起動するため、起動グループのnewInstanceメソッドを呼び出します。起動グループは、次のような役割を持ちます。
指定された記述子に対応するインスタンスを生成できなかった場合は、newInstanceメソッドはActivationExceptionをスローします。グループの
inactiveObjectメソッドは、Activatable.inactiveメソッドの呼び出しを介して間接的に呼び出されます。リモートオブジェクトの実装では、そのオブジェクトがアクティブでなくなったとき (アクティブでなくなったとみなされるとき) にActivatableのinactiveメソッドを呼び出さなければなりません。オブジェクトは、アクティブでなくなったときにActivatable.inactiveを呼び出すようにしないと、グループは作成したオブジェクトへの強い参照を保持したままになるため、そのようなオブジェクトのガベージコレクトは行われなくなります。グループの
inactiveObjectメソッドは、リモートオブジェクトがクライアントからの RMI 呼び出しに応じられないようにするため、id に関連付けられたリモートオブジェクトを RMI ランタイムからアンエクスポートします (リモートオブジェクトに対する保留状態の呼び出しや実行中の呼び出しがない場合に限る)。オブジェクトへの保留状態の呼び出しや実行中の呼び出しがある場合、inactiveObjectはfalseを返し、アクションをとりません。
unexportObjectオペレーションが成功すると (オブジェクトには保留状態または実行中の呼び出しがないことを意味する)、グループは、リモートオブジェクトが現在アクティブでない状態にあり、したがって、それ以降の起動要求時にはアクティベータによって再度起動できることを、そのActivationMonitorに知らせます (モニタのinactiveObjectを使用)。オペレーションが成功すると、inactiveObjectはtrueを返します。ActivationGroupによりオブジェクトがアクティブであると見なされる場合でも、すでにアンエクスポートされている場合は、このメソッドの呼び出しは成功することがあります。このオブジェクトがアクティブでないとすでに報告されている場合や、この起動グループで一度も起動されたことがないなどの理由から、起動グループがこのオブジェクトを知らない場合は、
inactiveObjectメソッドはUnknownObjectExceptionをスローします。アクティベータまたは起動グループのリモート呼び出しが失敗するなどの非起動処理が失敗した場合は、RemoteExceptionをスローします。
createGroupメソッドは、現在の JVM 用に起動グループを作成し、設定を行います。起動グループを設定できるのは、それが現在設定されていない場合だけです。起動グループは、activate要求を処理するため、Activatorが起動グループの再作成を開始したときにcreateGroupによって設定されます。グループをこのメソッドで作成する前には、グループ記述子をActivationSystemに登録しておく必要があります (前の登録から得たActivationIDを渡す)。
ActivationGroupDesc(desc) で指定するグループは、ActivationGroupの具象サブクラスでなければならず、そのグループのActivationGroupIDと、そのグループの初期化データが含まれたMarshalledObject(ActivationGroupDescから取得) の 2 つの引数をとる public コンストラクタを持っていなければなりません。ActivationGroupDesc.getClassNameメソッドがnullを返す場合、システムのデフォルトグループ実装が使用されます。 注: 独自のカスタム起動グループを作成する場合、グループのコンストラクタでセキュリティマネージャを設定するようにしなければなりません。 コンストラクタ内にセキュリティマネージャを設定しないと、グループの中でオブジェクトを起動することはできません。グループが作成されたら、グループの
ActivationMonitorを返すactiveGroupメソッドの呼び出しによりグループがアクティブな状態になったことが、ActivationSystemに知らされます。このコールバックの処理はcreateGroupメソッドが行うので、アプリケーション側で独自にactiveGroupを呼び出す必要はありません。グループが作成されると、それがアクティブでなくなるまで
currentGroupIDメソッドによりこのグループの識別子が返されます。グループがアクティブでなるなくと、currentGroupIDメソッドはnullを返します。パラメータ incarnation は、グループの現在の生成番号 (このグループが起動された回数を表す) を示します。生成番号は、グループの作成に成功した後、
activeGroupメソッドへのパラメータとして使用されます。生成番号はゼロから始まります。指定されたグループがすでに存在する場合、またはグループの作成中にエラーが発生した場合は、createGroupメソッドはActivationExceptionをスローします。
setSystemメソッドは、JVM のActivationSystem(system) を設定します。起動システムを設定できるのは、アクティブな状態のグループがない場合だけです。setSystemの明示的な呼び出しにより起動システムが設定されなかった場合、getSystemメソッドは、アクティベータのレジストリから java.rmi.activation.ActivationSystem という名前を探すことでActivationSystemへの参照の取得を試みます。起動システムを探すためにデフォルトで使用されるポート番号は、ActivationSystem.SYSTEM_PORT で定義されています。この値は、java.rmi.activation.port プロパティを設定することでオーバーライドできます。setSystemメソッドを呼び出したときにすでに起動システムが設定されている場合は、setSystemメソッドはActivationExceptionをスローします。
getSystemメソッドは、JVM の起動システムを返します。起動システムはsetSystemメソッドで設定できます (前述)。
activeObjectメソッドは、protected メソッドで、サブクラスが、グループのモニタへのactiveObjectコールバックを行って、指定された起動 id を持ち、スタブが mobj に含まれるリモートオブジェクトが現在アクティブな状態にあることをグループのモニタに知らせるために使用します。このメソッドの呼び出しは、単純にグループのActivationMonitorに転送されます。
inactiveGroupメソッドは、グループがアクティブでなくなったことをグループのモニタに知らせるため、サブクラスが使用する protected メソッドです。サブクラスは、JVM の中でグループが起動にかかわっているオブジェクトがアクティブでなくなるたびに、このメソッドを呼び出します。
MarshalledObject クラス
MarshalledObjectはオブジェクトのコンテナで、RMI 呼び出しの際にオブジェクトをパラメータとして引き渡せるようにするものですが、受け取った側でのオブジェクトの直列化復元は、コンテナオブジェクト呼び出しを介してアプリケーションがそのオブジェクトを明示的に要求するまで延期されます。MarshalledObjectに含まれるSerializableオブジェクトは、RMI 呼び出しの際に引き渡されたパラメータと同じセマンティクスで、要求時に直列化および直列化復元が行われます。これは、MarshalledObject内のすべてのリモートオブジェクトが、そのスタブの直列化されたインスタンスによって表現されることを意味します。MarshalledObjectに含まれるオブジェクトは、リモートオブジェクト、非リモートオブジェクトのどちらか、またはリモートと非リモートのオブジェクトの両方がそろったもののいずれかになります。オブジェクトが
MarshalledObjectラッパーの中に置かれると、直列化されたそのオブジェクトにコードベース URL (クラスのロード元) の情報が付加されます。 同様に、MarshalledObjectラッパーからオブジェクトが取り出されるときは、そのオブジェクトのコードがローカルになければ、直列化の際に付加された URL から、そのオブジェクトのクラスのバイトコードが特定されロードされます。
package java.rmi;public final class MarshalledObject implements java.io.Serializable { public MarshalledObject(Object obj) throws java.io.IOException; public Object get() throws java.io.IOException, ClassNotFoundException; public int hashCode(); public boolean equals(); }
MarshalledObjectのコンストラクタは、引数として直列化可能なオブジェクト obj をとり、オブジェクトがバイトストリームに整列化された形式のものを保持します。整列化された形式のオブジェクトは、次のように、RMI 呼び出しの際に引き渡されるオブジェクトのセマンティクスを保持します。
MarshalledObjectクラスのインスタンスがjava.io.ObjectOutputStreamに書き出されるときは、その中に含まれる整列化された形式のオブジェクト (構築時に作成されたもの) がストリームに書き出されます。 したがって、バイトストリームだけが直列化されます。
MarshalledObjectがjava.io.ObjectInputStreamから読み出されるときは、その中に含まれるオブジェクトは具象オブジェクトに直列化復元はされません。 整列化されたオブジェクトのgetメソッドが呼び出されるまで、オブジェクトは整列化された形式のままです。
getメソッドは、常に、整列化された形式で含められているオブジェクトの新しいコピーを再構築します。内部表現は、RMI 呼び出しの非整列化パラメータに対して使用されるセマンティクスで直列化復元されます。したがって、オブジェクトの表現を直列化復元すると、直列化されたオブジェクトのストリームに埋め込まれた URL 情報を使用してクラスコードがロードされます (ローカルにない場合)。整列化された形式のオブジェクトの
hashCodeは、コンストラクタに引き渡されたオブジェクトと同じです。equalsメソッドは、整列化された形式のオブジェクトどうしを比較し、それらが等価であれば true を返します。equals が比較を実行する際、クラスのコードベース注釈は無視されます。これは、2 つのオブジェクトが同じ直列化表現を保持する場合、それらは等価であることを意味します (直列化表現内の各クラスのコードベースを除く)。