| 目次 | 前 の項目 | 次の項目 | Java Remote Method Invocation |
RemoteRef インタフェースRemoteRefインタフェースは、リモートオブジェクトへのハンドルを表します。それぞれのスタブは、RemoteRefのインスタンスを持ち、そのインスタンスは参照の具体的な表現を含みます。このリモート参照は、参照されているリモートオブジェクトへのリモート呼び出し 実行に使われます。
package java.rmi.server;
public interface RemoteRef extends java.io.Externalizable {
Object invoke(Remote obj,
java.lang.reflect.Method method,
Object[] params,
long opnum)
throws Exception;
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();
}
1 つ目のinvoke(Remote,Method,Object[],long)メソッドは、メソッド呼び出しをスタブの (obj) リモート参照に委譲します。 委譲により、この参照はリモートホストへの接続のセットアップ処理を引き受け、method およびパラメータ params の表現を整列化してから、リモートホストへのメソッド呼び出しを伝えます。このメソッドは、リモートホスト上のリモートオブジェクトへのメソッド呼び出し の結果を返すか、または呼び出しが失敗した場合はRemoteExceptionをスローし、リモート呼び出しによって例外をスローした場合はアプリケーションレベルの例外をスローします。操作番号 opnum は、メソッドシグニチャーのハッシュを表し、転送用のメソッドの符号化に使うこともできます。opnum パラメータに使用されるメソッド hash は、64 ビット (long) の整数で、米国国立標準技術研究所 (NIST) の Secure Hash Algorithm (SHA-1) により、バイトストリームのメッセージダイジェストの最初の 2 つの 32 ビット値から計算されます。このバイトストリームには、
java.io.DataOutput.writeUTFメソッドを使って記述された場合と同様に、リモートメソッドの名前のあとにメソッド記述子を続けた文字列が含まれています。メソッド記述子の説明について は、『Java 仮想マシン仕様 (JVMS)』の 4.3.3 節を参照してください。
void myRemoteMethod(int count, Object obj, boolean flag)
リモートメソッドの名前および記述子を含む文字列は、次のようになります。
myRemoteMethod(ILjava/lang/Object;Z)V
64 ビットのハッシュ値は、8 バイトのシーケンスから成るリトルエンディアン合成形式です。その最初の 4 バイトは、ビッグエンディアン形式のバイト順序で示したメッセージダイジェストの最初の 32 ビット値であり、次の 4 バイトは、ビッグエンディアン形式のバイト順序で示したメッセージダイジェストの 2 番目の 32 ビット値です。たとえば、メッセージダイジェストの最初の 2 つの 32 ビット値が0xB0B1B2B3と0xB4B5B6B7であれば、ハッシュ値は0xB7B6B5B4B3B2B1B0になります。
注 - Java 2 SDK, Standard Edition, v1.2 では、newCall(RemoteObject,Operation[],int,long)、invoke(RemoteCall)、done(RemoteCall)メソッドの使用は推奨されていません。1.2 のスタブプロトコルバージョンを使ったrmicによって生成されたスタブは、これらのメソッドを現在は使いません。newCall、invoke、 およびdoneで構成される呼び出しのシーケンスは、Methodオブジェクトをパラメータの 1 つにとる新しいinvokeメソッドに置き換えられました。
newCallメソッドは、リモートオブジェクト obj 上での新しいリモートメソッド呼び出し用の適切な呼び出しオブジェクトを作成します。操作配列 op は、リモートオブジェクト上で利用可能な複数の操作を含みます。操作番号 opnum は、操作配列の中の今回のリモート呼び出しで使用する特定の操作を指定するためのインデックスです。hash インタフェースは、v1.1 スタブプロトコルを使用してスタブとスケルトンとの間で互換性を持たせるために使用する、64 ビットの値です。このインタフェースは、SHA-1 を使用して、特定のバイトストリームのメッセージダイジェストにある、最初の 2 つの 32 ビット値から計算されます。 このバイトストリームには、java.io.DataOutputインタフェースのwriteIntメソッドとwriteUTFメソッドを使用して書かれた場合と同様のデータが含まれ、次のアイテムから構成されます。( int) スタブのバージョン番号で、常に 1各リモートメソッドに対して操作番号順に、
- (UTF-8) リモートメソッド名
- (UTF-8) リモートメソッド記述子 (JVMS のセクション 4.3.3 を参照)
- 宣言された各例外に対してバイナリ名の辞書順に、
- (UTF-8) 例外クラスの名前
インタフェースのハッシュ値は、上記の
invokeメソッドで使用されたメソッドのハッシュと同じ方法で、メッセージダイジェストから作成されます。
invoke(RemoteCall)メソッドは、リモート呼び出しを実行します。invokeは、すべての「ユーザ」例外を発生させます。この例外は、スタブではキャッチせずに通過させるものです。リモート呼び出しの途中でなんらかの例外が発生し た場合には、invokeは、ユーザ例外またはRemoteExceptionを発生させる前に接続のクリーンアップを行います。
doneメソッドは、リモート参照に接続のクリーンアップ (または再利用) を許可します。doneが呼び出されるのは、invoke呼び出しが正常に行われて (例外を発生させずに) 終了し、スタブに戻った場合だけです。
getRefClassメソッドは、直列化されてストリームに出力 (out) される参照タイプ内でパッケージ修飾されていないクラス名を返します。
remoteHashCodeメソッドは、リモートオブジェクトのハッシュコードを返します。同一のリモートオブジェクトを参照する 2 つのリモートオブジェクトスタブは (リモートオブジェクトをハッシュテーブル上のキーとしてサポートするために) 同じハッシュコードを持ちます。RemoteObjectは、hashCodeメソッドへの呼び出しをリモート参照のremoteHashCodeメソッドへ転送します。
remoteEqualsメソッドは、2 つのリモートオブジェクトを比較して異同判定します。2 つのリモートオブジェクトは、両者が同一のリモートオブジェクトを参照するとき等しいとされます。たとえば、2 つのスタブは両者が同一のリモートオブジェクトを参照するならば等しいとされます。RemoteObjectは、そのequalsメソッドへの呼び出しをリモート参照のremoteEqualsメソッドへ転送します。