目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
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) リモート参照に委譲します。委譲により、この参照はリモートホストへの接続をセットアップする処理を引き受け、メソッドおよびパラメータ params の表現を整列化してから、リモートホストへのメソッド呼び出しを伝えます。このメソッドは、リモートホスト上のリモートオブジェクトへのメソッド呼び出しの結果を返すか、または呼び出しが失敗した場合は RemoteException を、リモート呼び出しが例外をスローした場合はアプリケーションレベルの例外をスローします。操作番号 opnum は、メソッドシグニチャーのハッシュを表し、転送用のメソッドの符号化に使うこともできます。opnum のメソッド hash は、64 ビット (long) の整数で、米国連邦情報技術局 (NIST) の Secure Hash Algorithm (SHA-1) により、バイトストリームのメッセージダイジェストの最初の 2 つの 32 ビット値を使って計算されます。このバイトストリームには、リモートメソッドの名前のあとにメソッド記述子を続けた文字列を UTF コード化したものが含まれています。メソッド記述子の説明については、Java Virtual Machine 仕様の 4.3.3 節を参照してください。ハッシュ値は、SHA-1 ハッシュの 1 つ目と 2 つ目の 32 ビット値で組み立てられます。
long hash = sha[1] << 32 + sha[0]
注 - JDK 1.2 では、newCall
メソッド、invoke
メソッド、およびdone
メソッドの使用は推奨されていません。JDK 1.2 のスタブプロトコルバージョンを使った rmic によって生成されたスタブは、これらのメソッドは使いません。newCall
、invoke
、および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
メソッドは、そのリモートオブジェクトへの参照を表現する文字列を返します。