目次 | 前へ | 次へ | Java Remote Method Invocation |
Activator
インタフェース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
の呼び出しを検出します。同じグループで、現在の生成番号よりも若い生成番号を持つ呼び出しは破棄されます。
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
をシャットダウンするためには、次のコマンドを実行します。
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
に認識されないオブジェクトである場合は、メソッドは UnknownObjectException
をスローします。リモート呼び出しが失敗した場合は、RemoteException
をスローします。
activeObject
は、id に関連付けられたオブジェクトが現在アクティブな状態にあることを ActivationMonitor
に知らせます。パラメータ obj には、オブジェクトの整列化された形式のスタブを指定します。ActivationGroup
は、グループ内のオブジェクトがシステムにより直接起動される以外の方法でアクティブになった場合 (オブジェクトが自分自身で登録して「起動した」場合など) は、それをモニターに知らせなければなりません。指定されたオブジェクト id が登録されていない場合は、メソッドは UnknownObjectException
をスローします。リモート呼び出しが失敗した場合は、RemoteException
をスローします。
inactiveGroup
は、id と incarnation で指定されたグループが現在アクティブでないことをモニターに知らせます。グループ内のオブジェクトを起動する要求がそれ以降発生すると、グループはより大きな生成番号で再作成されます。グループは、その中にあるすべてのオブジェクトが停止していると報告されると停止します。指定されたグループ id が登録されていないか、指定された生成番号がグループの現在の生成番号よりも小さい場合は、メソッドは UnknownGroupException
をスローします。リモート呼び出しが失敗した場合は、RemoteException
をスローします。
ActivationInstantiator
クラスActivationInstantiator
は、起動可能オブジェクトのインスタンスを生成する役割を持ちます。ActivationGroup
の具象サブクラスでは、グループ内でのオブジェクトの作成を処理するため newInstance
を実装しています。
package java.rmi.activation;アクティベータは、起動識別子 id と起動記述子 desc を持つオブジェクトをグループ内に再作成するため、インスタンシエータの
public interface ActivationInstantiator extends java.rmi.Remote { public MarshalledObject newInstance(ActivationID id, ActivationDesc desc) throws ActivationException, java.rmi.RemoteException; }
newInstance
メソッドを呼び出します。インスタンシエータは、次の処理を行います。
getClassName
メソッドを使って、オブジェクトのクラスを決定するgetLocation
メソッドを使って起動記述子から取得したコードベースパスから、そのクラスをロードするActivationID
、およびオブジェクト固有の初期化データが格納されている MarshalledObject
の、2 つの引数をとるMarshalledObject
を返す。inactiveObject
を呼び出せるように、作成または起動したオブジェクトがアクティブでなくなったことをその ActivationMonitor
に報告する役割も持ちます (詳細は ActivationGroup
クラスを参照)。
オブジェクトの起動が失敗した場合は、newInstance メソッドは ActivationException
をスローします。リモート呼び出しが失敗した場合は、RemoteException
をスローします。
ActivationGroupDesc
クラスActivationGroupDesc
) には、同じ JVM 内でオブジェクトを起動する起動グループを作成または再作成するのに必要な情報が含まれます。
null
の場合、デフォルトの ActivationGroup
実装を表す)ActivationGroup
の具象サブクラスでなければなりません。ActivationGroup
のサブクラスは、次の 2 つの引数をとる特別なコンストラクタを呼び出す static メソッド ActivationGroup.createGroup
により作成または再作成されます。
package java.rmi.activation;1 つ目のコンストラクタは、グループの実装とコード位置としてシステムのデフォルト値を使用するグループ記述子を作成します。プロパティーは、Java アプリケーション環境のオーバーライド (グループ実装の JVM 内のシステムプロパティーをオーバーライドする) を指定します。コマンド環境では、子 JVM の起動に使用される正確なコマンドやオプションを制御するか、または
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(); }
null
を設定して rmid
のデフォルトを受け入れることが可能です。このコンストラクタは null
グループのクラス名を使って ActivationGroupDesc
を作成します。これはシステムのデフォルトである 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
は最初、次のどれかの方法で作成します。
ActivationDesc
作成の副作用としてActivationGroup.createGroup
メソッドを明示的に呼び出した場合ActivationGroupDesc
の登録のみが行われているグループ内の最初のオブジェクトを起動した副作用として。ActivationGroup
を再作成できるのはアクティベータだけです。アクティベータは、登録されている起動グループごとに、必要に応じて独立した JVM (たとえば、子プロセスとして) を生成し、起動要求を適切なグループに転送します。JVM をどのように生成するかは、実装に任せられます。起動グループは、static メソッド ActivationGroup.createGroup
により作成します。createGroup
メソッドには、作成するグループに関して、1) グループは ActivationGroup
の具象サブクラスでなければならない、2) グループは次の 2 つの引数をとるコンストラクタを持っていなければならない、という決まりがあります。
作成時、ActivationGroup
のデフォルトの実装では、システムプロパティーは ActivationGroupDesc
が作成されたときのシステムプロパティー値に設定され、セキュリティーマネージャーは java.rmi.RMISecurityManager
に設定されます。グループ内でオブジェクトが起動されるときに、いくつかのプロパティーについては独自の値を設定する場合は、任意の ActivationDesc
が作成される前、つまり、デフォルトの ActivationGroupDesc
が作成される前に設定するようにすべきです。
package java.rmi.activation;アクティベータは、起動記述子 desc を持つオブジェクトを起動するため、起動グループの
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; }
newInstance
メソッドを呼び出します。起動グループは、次のような役割を持ちます。
getClassName
メソッドを使って、オブジェクトのクラスを決定するgetLocation
メソッドを使って起動記述子から取得した URL から、そのクラスをロードするActivationID
と、オブジェクトの初期化データが含まれる MarshalledObject
の 2 つの引数をとるオブジェクトのクラスの特別なコンストラクタを呼び出して、そのクラスのインスタンスを生成する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 用に起動グループを作成し、設定を行います。起動グループを設定できるのは、それが現在設定されていない場合だけです。起動グループが createGroup
メソッドを使用して設定されるのは、着信する activate
要求を実行するために、Activator
が起動グループの再作成を開始したときです。グループをこのメソッドで作成する前には、グループ記述子を 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
メソッドを呼び出したときにすでに起動システムが設定されている場合は、メソッドは 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 呼び出しの際に引き渡されるオブジェクトのセマンティクスを保持します。
get
メソッドの呼び出しによりオブジェクトが再構築されるときに、各クラスのバイトコードを特定、ロードできるように、ストリーム中の各クラスには、そのコードベース URL 情報が付加されるMarshalledObject
クラスのインスタンスが java.io.ObjectOutputStream
に書き出されるときは、その中に含まれる整列化された形式のオブジェクト (構築時に作成されたもの) がストリームに書き出されます。したがって、バイトストリームだけが直列化されます。
MarshalledObject
が java.io.ObjectInputStream
から読み出されるときは、その中に含まれるオブジェクトは具象オブジェクトに直列化復元はされません。整列化されたオブジェクトの get
メソッドが呼び出されるまで、オブジェクトは整列化された形式のままです。
get
メソッドは、常に、整列化された形式で含められているオブジェクトの新しいコピーを再構築します。内部表現は、RMI 呼び出しの非整列化パラメータに対して使用されるセマンティクスで直列化復元されます。したがって、オブジェクトの表現を直列化復元すると、直列化されたオブジェクトのストリームに埋め込まれた URL 情報を使用してクラスコードがロードされます (ローカルにない場合)。
整列化された形式のオブジェクトの hashCode
は、コンストラクタに引き渡されたオブジェクトと同じです。equals
メソッドは、整列化された形式のオブジェクトどうしを比較し、それらが等価であれば true を返します。equals が比較を実行する際、クラスのコードベース注釈は無視されます。これは、2 つのオブジェクトが同じ直列化表現を保持する場合、それらは等価であることを意味します (直列化表現内の各クラスのコードベースを除く)。