目次|| Java Remote Method Invocation


7.4起動インタフェース

RMI起動プロトコルでは、システムの正常な動作のため、アクティベータに関して守るべき次の2つの約束事があります。 アクティベータは、起動処理に関与するグループとオブジェクトに対する適切な情報のデータベースを保持します。


7.4.1 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に対応する起動記述子がこのアクティベータに登録されていない場合、activateUnknownObjectExceptionをスローします。アクティベータへのリモート呼出しが失敗した場合は、RemoteExceptionがスローされます。


7.4.2 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; }

注 -セキュリティ保護のため、上記のすべてのメソッド(registerGroupactiveGroupunregisterGroupregisterObjectunregisterObject、および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]
このコマンドにより、指定されたポートで起動デーモンがシャットダウンされます。ポートを指定しない場合、デフォルト・ポート上のデーモンがシャットダウンされます。


7.4.3 ActivationMonitorクラス

ActivationMonitorActivationGroupに固有のクラスで、ActivationSystem.activeGroupの呼び出し(ActivationGroup.createGroupメソッドにより内部的に呼び出される)によりグループの報告が行われたときに取得されます。次の場合には、起動グループは、ActivationMonitorに報告する必要があります。
a.そのオブジェクトがアクティブになったとき

b. そのオブジェクトがアクティブでなくなったとき

c.グループ全体がアクティブでなくなったとき。

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は、idincarnationで指定されたグループが現在アクティブでないことをモニターに知らせます。グループ内のオブジェクトを起動する要求がそれ以降発生すると、グループはより大きな生成番号で再作成されます。グループは、その中にあるすべてのオブジェクトが停止していると報告されると停止します。指定されたグループidが登録されていないか、指定された生成番号がグループの現在の生成番号よりも小さい場合は、メソッドはUnknownGroupExceptionをスローします。リモート呼出しが失敗した場合は、RemoteExceptionをスローします。


7.4.4 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をスローします。


7.4.5 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を作成します。これはシステムのデフォルトであるActivationGroup実装を示すものです。

2番目のコンストラクタは最初と同じですが、PropertiesおよびCommandEnvironmentを指定できるようになっています。

getClassNameメソッドは、グループのクラス名(nullの場合が多い)を返します。nullグループのクラス名は、システムのデフォルトであるActivationGroup実装を示します。

getLocationメソッドは、グループのクラスのロード元となるコードベース・パスを返します。

getDataメソッドは、整列化された形式のグループの初期化データを返します。

getCommandEnvironmentメソッドは、コマンド環境(nullの場合が多い)を返します。

getPropertiesOverridesメソッドは、この記述子のプロパティ・オーバーライド(nullの場合が多い)を返します。


7.4.6 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メソッドは、環境オブジェクトのコマンド文字列を返します。


7.4.7 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を返します。


7.4.8 ActivationGroupクラス

ActivationGroupは、そのグループ内に起動可能オブジェクトの新しいインスタンスを生成し、次の場合にActivationMonitorに通知します。
a.そのオブジェクトがアクティブになったとき

b.そのオブジェクトがアクティブでなくなったとき

c.グループ全体がアクティブでなくなったとき。
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メソッドを呼び出します。起動グループは、次のような役割を持ちます。 指定された記述子に対応するインスタンスを生成できなかった場合は、メソッドはActivationExceptionをスローします。

グループのinactiveObjectメソッドは、Activatable.inactiveメソッドの呼出しを介して間接的に呼び出されます。リモート・オブジェクトの実装では、そのオブジェクトがアクティブでなくなったとき(アクティブでなくなったと見なされるとき)にActivatableinactiveメソッドを呼び出さなければなりません。オブジェクトが終了時にActivatable.inactiveを呼び出さないと、グループは自身が作成したオブジェクトへの強参照を保持するので、オブジェクトは決してガベージ・コレクトされません。

グループのinactiveObjectメソッドは、リモート・オブジェクトがクライアントからのRMI呼出しに応じられないようにするため、idに関連付けられたリモート・オブジェクトをRMIランタイムからアンエクスポートします(リモート・オブジェクトに対する保留状態の呼び出しや実行中の呼出しがない場合に限る)。オブジェクトへの保留状態の呼び出しや実行中の呼出しがある場合、inactiveObjectfalseを返し、アクションをとりません。

unexportObjectオペレーションが成功すると(オブジェクトには保留状態または実行中の呼出しがないことを意味する)、グループは、リモート・オブジェクトが現在アクティブでない状態にあり、したがって、それ以降の起動要求時にはアクティベータによって再度起動できることを、そのActivationMonitorに知らせます(モニターのinactiveObjectを使用)。オペレーションが成功すると、inactiveObjecttrueを返します。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の中でグループが起動にかかわっているオブジェクトがアクティブでなくなるたびに、このメソッドを呼び出します。


7.4.9 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に書き出されるときは、その中に含まれる整列化された形式のオブジェクト(構築時に作成されたもの)がストリームに書き出されます。したがって、バイト・ストリームだけが直列化されます。

MarshalledObjectjava.io.ObjectInputStreamから読み出されるときは、その中に含まれるオブジェクトは具象オブジェクトに直列化復元はされません。整列化されたオブジェクトのgetメソッドが呼び出されるまで、オブジェクトは整列化された形式のままです。

getメソッドは、常に、整列化された形式で含められているオブジェクトの新しいコピーを再構築します。内部表現は、RMI呼出しの非整列化パラメータに対して使用されるセマンティックスで直列化復元されます。したがって、オブジェクトの表現を直列化復元すると、直列化されたオブジェクトのストリームに埋め込まれたURL情報を使用してクラス・コードがロードされます(ローカルにない場合)。

整列化された形式のオブジェクトのhashCodeは、コンストラクタに引き渡されたオブジェクトと同じです。equalsメソッドは、整列化された形式のオブジェクトどうしを比較し、それらが等価であればtrueを返します。equalsが比較を実行する際、クラスのコード・ベース注釈は無視されます。これは、2つのオブジェクトが同じ直列化表現を保持する場合、それらは等価であることを意味します(直列化表現内の各クラスのコード・ベースを除く)。



目次||
Copyright 1997, 2010, Oracle and/or its affiliates. All rights reserved.