目次 | 前の項目 | 次の項目 | 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
をシャットダウンするためには、次のコマンドを実行します。
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
メソッドが適宜に実装されます。
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 つのオブジェクトが同じ直列化表現を保持する場合、それらは等価であることを意味します (直列化表現内の各クラスのコードベースを除く)。