目次|前|次 | 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つのオブジェクトが同じ直列化表現を保持する場合、それらは等価であることを意味します(直列化表現内の各クラスのコード・ベースを除く)。