rmic コンパイラにより生成されるスタブとスケルトンが使用するインタフェースとクラスを説明します。
java.rmi.server.RemoteStub クラスは全てのクライアントスタブに共通なスーパークラスです。スタブオブジェクトは代理であり、リモートオブジェクトの実際の実装が定義するのと全く同じインタフェースのセットをサポートします。
package java.rmi.server;
public abstract class RemoteStub extends java.rmi.RemoteObject {}
RemoteCall インタフェースはリモートオブジェクトのスタブとスケルトンがリモートオブジェクトへの呼び出しを実行するための抽象化です。
package java.rmi.server;
import java.io.*;
public interface RemoteCall {
ObjectOutput getOutputStream() throws IOException;
void releaseOutputStream() throws IOException;
ObjectInput getInputStream() throws IOException;
void releaseInputStream() throws IOException;
ObjectOutput getResultStream(boolean success)
throws IOException, StreamCorruptedException;
void executeCall() throws Exception;
void done() throws IOException;
}
getOutputStream メソッドは出力ストリームを返す。スタブは引数を一体化してその出力ストリームに送り出し、スケルトンはそこから結果を分解して取り出す。
releaseOutputStream メソッドは出力ストリームを開放します。トランスポートによってはこのメソッドはストリーム自体を開放します。
getInputStream メソッドは InputStream の結果を返す。スタブはそこから結果を分解して取り出すか、スケルトンはパラメーターを分解して取り出す。
releaseInputStream メソッドは入力ストリームを開放します。この結果いくつかのトランスポートは接続の入力側を早期に開放することができます。
getResultStream メソッドは出力ストリームを返します (コールが成功したかどうかを示すヘッダー情報を書き込んだ後)。 結果ストリームを得ることができるのは一回のリモートコールに対して一回のみです。 もし success が true ならば、転送のため一体化される結果は正常終了であり、それ以外の場合の結果は例外になります。
StreamCorruptedException は、そのリモートコールに対しての結果ストリームがすでに得られている場合にスローされます。
executeCall メソッドは何であれ与えられた値によりコールを実行します。
done メソッドはリモートコールが完了した後のクリーンアップを許可します。
RemoteRef インタフェースはリモートオブジェクトへのハンドルを表します。 それぞれのスタブは RemoteRef のインスタンスを持ち、そのインスタンスは参照の具体的な表現を含みます。このリモート参照は参照されているリモートオブジェクトへのリモートコール実行に使われます。
package java.rmi.server;
public interface RemoteRef extends java.io.Externalizable {
RemoteCall newCall(RemoteObject obj, Operation[] op, int opnum,
long hash) throws RemoteException;
void invoke(RemoteCall call) throws Exception;
void done(RemoteCall call) throws RemoteException;
String getRefClass(java.io.ObjectOutput out);
int remoteHashCode();
boolean remoteEquals(RemoteRef obj);
String remoteToString();
}
newCall メソッドはリモートオブジェクト obj 上での新しいリモートメソッド呼び出しのための適切な呼び出しオブジェクトを作成します。
操作配列 op はリモートオブジェクト上で利用可能な複数の操作を含みます。
操作番号 opnum は操作配列の中の今回リモートコールで使用する特定の操作を指定するためのインデックスです。
操作配列とインデックスを渡すことにより、スタブジェネレーターは操作インデックスを割り付けてそれらを解釈することができます。
リモート参照では呼び出しの中でエンコードするために操作記述子を必要とすることがあります。
invoke メソッドはリモートコールを実行します。 invoke は全ての「ユーザ (user) 定義」例外を発生させます。この例外はスタブでは捉えずに通過させるべきものです。
リモート呼び出しの途中で何らかの例外が発生した場合には、invoke はユーザ定義例外または RemoteException を発生させる前に接続のクリーンアップを行います。
done メソッドはリモート参照に接続のクリーンアップ(または再利用)を許可します。done がコールされるのは invoke コールが成功裡に(例外を発生させずに)終了してスタブに戻った場合のみです。
getRefClass メソッドは、直列化されてストリームに出力される参照タイプの内でパッケージ修飾されていないクラス名を返します
remoteHashCode メソッドはリモートオブジェクトの ハッシュコードを返します。 同一のリモートオブジェクトを参照する2つのリモートオブジェクトスタブは(リモートオブジェクトをハッシュテーブル上のキーとしてサポートするために)同じハッシュコードを持ちます。
RemoteObject は hashCodeメソッドへのコールをリモート参照の remoteHashCode メソッドへ転送します。
remoteEqualsメソッドは2つのリモートオブジェクトを比較して異同判定します。2つのリモートオブジェクトは両者が同一のリモートオブジェクトを参照するとき等しいとされます。
例えば、2つのスタブはもし両者が同一のリモートオブジェクトを参照するならば等しいとされます。
RemoteObject はその equals メソッドへの呼び出しをリモート参照のremoteEquals メソッドへ転送します。
remoteToString メソッドはそのリモートオブジェクトへの参照を表現する文字列を返します。
ServerRefインタフェースはリモートオブジェクトの実装に対するサーバ側のハンドルを表します。
package java.rmi.server;
public interface ServerRef extends RemoteRef {
RemoteStub exportObject(java.rmi.Remote obj, Object data)
throws java.rmi.RemoteException;
String getClientHost() throws ServerNotActiveException;
}
exportObjectメソッドは与えられた Remote オブジェクトの実装 obj に対するクライアントスタブオブジェクトを探すかまたは作成します。
パラメーターデータにはオブジェクトをエクスポートするのに必要となる情報(例えばポート番号)が含まれます。
getClientHost メソッドは現在のクライアントのホスト名を返します。
現在リモートメソッド呼び出しを操作中のスレッドからコールされた場合には、コールを実行中のクライアントのホスト名が返されます。リモートメソッドへのコールが現在実行中でなければ、ServerNotActiveException がコールされます。
Skeleton インタフェースは rmic コンパイラにより作成されたスケルトンの実装によってのみ使用されます。
リモートオブジェクトに対するスケルトンとは、実際のリモートオブジェクトの実装へコールをディスパッチするサーバ側の要素です。
package java.rmi.server;
public interface Skeleton {
void dispatch(Remote obj, RemoteCall call, int opnum, long hash)
throws Exception;
Operation[] getOperations();
}
dispatch メソッドはコールオブジェクトから入力ストリームとして得られた引数をストリームの分解によって取り出し、実際のリモートオブジェクトの実装である obj 上のメソッド(操作番号 opnum で示される)を呼び出します。そして返り値をストリームに流すため一体化するか、または呼び出し中に例外が発生した場合には例外をスローします。
getOperations メソッドはリモートオブジェクトのメソッドに対する操作記述子が書かれた配列を返します。
Operation クラスはリモートオブジェクトに対する Java メソッドの記述子を保持します。
package java.rmi.server;
public class Operation {
public Operation(String op);
public String getOperation();
public String toString();
}
Operation オブジェクトは多くの場合メソッドのシグネチャ付きで生成されます。
getOperation メソッドは操作記述子の内容を返します。(初期化されたときの値)
toStringメソッドもまた操作の文字列による表現を返します。(典型的にはメソッドのシグネチャ)