目次 | 前の項目 | 次の項目 Java Remote Method Invocation


8.3 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 メソッドは、メソッド呼び出しをスタブの (obj) リモート参照に委譲します。 委譲により、この参照はリモートホストへの接続のセットアップ処理を引き受け、method およびパラメータ params の表現を整列化してから、リモートホストへのメソッド呼び出しを伝えます。このメソッドは、リモートホスト上のリモートオブジェクトへのメソッド呼び出しの結果を返すか、または呼び出しが失敗した場合は RemoteException をスローし、リモート呼び出しによって例外をスローした場合はアプリケーションレベルの例外をスローします。操作番号 opnum は、メソッドシグニチャーのハッシュを表し、転送用のメソッドの符号化に使うこともできます。

opnum パラメータに使用されるメソッド hash は、64 ビット (long) の整数で、米国国立標準技術研究所 (NIST) の Secure Hash Algorithm (SHA-1) により、バイトストリームのメッセージダイジェストの最初の 2 つの 32 ビット値から計算されます。このバイトストリームには、java.io.DataOutput.writeUTF メソッドを使って記述された場合と同様にリモートメソッドの名前のあとにメソッド記述子を続けた文字列が含まれています。メソッド記述子の説明については、『Java 仮想マシン仕様』の 4.3.3 節を参照してください。

たとえば、リモートインタフェースのメソッドが次の名前とシグニチャーを持っている場合、

	void myRemoteMethod(int count, Object obj, boolean flag)


リモートメソッドの名前および記述子を含む文字列は、次のようになります。

	myRemoteMethod(ILjava.lang.Object;Z)V


ハッシュ値は、SHA-1 メッセージダイジェストの 1 つ目と 2 つ目の 32 ビット値で組み立てられます。メッセージダイジェストの結果が、5 つの 32 ビット文字 H0 H1 H2 H3 H4 からなる sha という名前の 5 つの整数値である場合、ハッシュ値は次のように計算されます。

long hash = ((sha[0] >>>  24) & 0xFF) |
            ((sha[0] >>>  16) & 0xFF) <<  8 |
            ((sha[0] >>>   8) & 0xFF) << 16 |
            ((sha[0] >>>   0) & 0xFF) << 24 |
            ((sha[1] >>>  24) & 0xFF) << 32 |
            ((sha[1] >>>  16) & 0xFF) << 40 |
            ((sha[1] >>>   8) & 0xFF) << 48 |
            ((sha[1] >>>   0) & 0xFF) << 56;



注 - Java 2 SDK, Standard Edition, v1.2 では、newCallinvokedone メソッドの使用は推奨されていません。1.2 のスタブプロトコルバージョンを使った rmic によって生成されたスタブは、これらのメソッドは現在は使いません。newCallinvoke、および done で構成される呼び出しのシーケンスは、Method オブジェクトをパラメータの 1 つにとる新しい invoke メソッドに置き換えられました。
newCall メソッドは、リモートオブジェクト obj 上での新しいリモートメソッド呼び出し用の適切な呼び出しオブジェクトを作成します。操作配列 op は、リモートオブジェクト上で利用可能な複数の操作を含みます。操作番号 opnum は、操作配列の中の今回のリモート呼び出しで使用する特定の操作を指定するためのインデックスです。操作配列とインデックスを渡すことにより、スタブジェネレータは、操作インデックスを割り付けてそれらを解釈することができます。リモート参照では、呼び出しの中で符合化するために操作記述子を必要とすることがあります。

invoke メソッドは、リモート呼び出しを実行します。 invoke は、すべての「ユーザ (user) 定義」例外を発生させます。 この例外は、スタブではキャッチせずに通過させるものです。リモート呼び出しの途中でなんらかの例外が発生した場合には、invoke は、ユーザ定義例外または RemoteException を発生させる前に接続のクリーンアップを行います。

done メソッドは、リモート参照に接続のクリーンアップ (または再利用) を許可します。done が呼び出されるのは、invoke 呼び出しが正常に行われて (例外を発生させずに) 終了し、スタブに戻った場合だけです。

getRefClass メソッドは、直列化されてストリームに出力 (out) される参照タイプ内でパッケージ修飾されていないクラス名を返します。

remoteHashCode メソッドは、リモートオブジェクトの ハッシュコードを返します。同一のリモートオブジェクトを参照する 2 つのリモートオブジェクトスタブは (リモートオブジェクトをハッシュテーブル上のキーとしてサポートするために) 同じハッシュコードを持ちます。RemoteObject は、hashCodeメソッドへの呼び出しをリモート参照の remoteHashCode メソッドへ転送します。

remoteEquals メソッドは、2 つのリモートオブジェクトを比較して異同判定します。2 つのリモートオブジェクトは、両者が同一のリモートオブジェクトを参照するとき等しいとされます。たとえば、2 つのスタブは両者が同一のリモートオブジェクトを参照するならば等しいとされます。RemoteObject は、その equals メソッドへの呼び出しをリモート参照の remoteEquals メソッドへ転送します。

remoteToString メソッドは、そのリモートオブジェクトへの参照を表す String を返します。



目次 | 前の項目 | 次の項目
Copyright © 1997-2001 Sun Microsystems, Inc. All Rights Reserved.