目次|| 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();
}



invoke(Remote,Method,Object[],long)メソッドは、メソッド呼出しをスタブの(obj)リモート参照に委譲します。委譲により、この参照はリモート・ホストへの接続の設定処理を引き受け、methodおよびパラメータparamsの表現を整列化してから、リモート・ホストへのメソッド呼出しを伝えます。このメソッドは、リモート・ホスト上のリモート・オブジェクトへのメソッド呼出しの結果を返すか、または呼出しが失敗した場合はRemoteExceptionをスローし、リモート呼出しによって例外をスローした場合はアプリケーション・レベルの例外をスローします。操作番号opnumは、メソッド・シグネチャのハッシュを表し、転送用のメソッドのエンコードに使用することもできます。

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

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

   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によって生成されたスタブは、これらのメソッドを現在は使用しません。newCallinvoke、およびdoneで構成される呼出しのシーケンスは、Methodオブジェクトをパラメータの1つにとる新しいinvokeメソッドに置き換えられました。
newCallメソッドは、リモート・オブジェクトobj上での新しいリモート・メソッド呼出し用の適切な呼出しオブジェクトを作成します。操作配列opは、リモート・オブジェクト上で利用可能な複数の操作を含みます。操作番号opnumは、操作配列のうち、今回のリモート呼出しで使用する特定の操作を指定するためのインデックスです。インタフェース・ハッシュは、v1.1スタブ・プロトコルを使用するスタブとスケルトン間の互換性維持に使用する64ビット値です。インタフェース・ハッシュは、SHA-1を使用する特定のバイト・ストリームのメッセージ・ダイジェストの最初の2つの32ビット値から計算されます。このバイト・ストリームに含まれるデータの書込みは、java.io.DataOutputインタフェースのwriteIntおよびwriteUTFメソッドを使用した場合と同じ方法で行われます。データには次の項目が含まれます。

インタフェース・ハッシュ値をメッセージ・ダイジェストから作成する方法は、invokeメソッドで使用するメソッド・ハッシュに関してすでに説明した方法と同じです。

invoke(RemoteCall)メソッドは、リモート呼出しを実行します。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, 2010, Oracle and/or its affiliates. All rights reserved.