目次 | 前の項目 | 次の項目 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 に対応する起動記述子がこのアクティベータで登録されていない場合は、activate メソッドは UnknownObjectException をスローします。アクティベータのリモート呼び出しが失敗した場合は、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 に認識されないオブジェクトである場合は、inactiveObject メソッドは UnknownObjectException をスローします。リモート呼び出しが失敗した場合は、RemoteException をスローします。

activeObject は、id に関連付けられたオブジェクトが現在アクティブな状態にあることを ActivationMonitor に知らせます。パラメータ obj には、オブジェクトの整列化された形式のスタブを指定します。ActivationGroup は、グループ内のオブジェクトがシステムにより直接起動される以外の方法でアクティブになった場合 (オブジェクトが自分自身で登録して起動した場合など) は、それをモニタに知らせなければなりません。指定されたオブジェクト id が登録されていない場合は、activeObjectUnknownObjectException をスローします。リモート呼び出しが失敗した場合は、RemoteException をスローします。

inactiveGroup は、idincarnation で指定されたグループが現在アクティブでないことをモニタに知らせます。グループ内のオブジェクトを起動する要求がそれ以降発生すると、グループはより大 きな生成番号で再作成されます。グループ内のすべてのオブジェクトが、自分がアクティブでなくなったことを報告すると、グループはアクティブでなくなりま す。指定されたグループ id が登録されていないか、指定された生成番号がグループの現在の生成番号よりも小さい場合は、inactiveGroup メソッドは 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 を作成します。グループクラス名 null は、システムのデフォルトである 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 メソッドを呼び出します。起動グループは、次のような役割を持ちます。

指定された記述子に対応するインスタンスを生成できなかった場合は、newInstance メソッドは ActivationException をスローします。

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

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

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


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-2004 Sun Microsystems, Inc. All Rights Reserved.