RMI規範--第八章

8399 ワード

この章にはrmic stubコンパイラが生成したstubとskletonで使用するインタフェースとクラスが含まれています.
トピック:
RemoteStubクラス
RemoteCallインタフェース
RemoteRefインタフェース
ServerRefインタフェース
Skeletonインタフェース
Operationクラス
8.1 RemoteStubクラス
java.rmi.server.RemoteStubクラスは、リモートオブジェクトstubの汎用スーパークラスです.stubオブジェクトは、リモート・インタフェース・セットがリモート・オブジェクトの実装と完全に同じであることをサポートするエージェントです.

package java.rmi.server; 
public abstract class RemoteStub extends java.rmi.RemoteObject 
{ 
protected RemoteStub(); 
protected RemoteStub(RemoteRef ref); 
protected static void setRef(RemoteStub stub, RemoteRef ref); 
} 

RemoteStubの最初のコンストラクション関数は、空のリモート参照を持つstubを作成します.2番目のコンストラクション関数は、指定されたリモートリファレンスrefを持つstubを作成します.
JDK1.2ではsetRefメソッドの使用は奨励されず(サポートされていない).
8.1.1リモートオブジェクトとstubクラスのタイプの等価性
クライアントは、リモート・インタフェース・セットがリモート・オブジェクト・クラスで定義されているのと全く同じstub(エージェント)オブジェクトとインタラクティブになります.stubクラスは、1つ以上のリモートインタフェースを実装する実装クラスのエッセンスによって生成されるため、
したがってstubクラスには、クラス階層(オブジェクトを構成するタイプ図)の非リモート部分は含まれません.例えば、CがBを拡張し、BがAを拡張するが、Bのみがリモートインタフェースを実装する場合、stubはCではなくBによって生成される.
stubはリモートオブジェクトクラスと同じリモートインタフェースセットを実装するため、Javaシステムの観点から、stubはサーバオブジェクトタイプマップのリモート部分と同じタイプを有する.これにより、クライアントは内蔵
Javaアクションは、リモート・オブジェクトのタイプをチェックするとともに、1つのリモート・インタフェースから別のリモート・インタフェースへの強制タイプ変換を行います.stubはrmicコンパイラで生成されます.
8.1.2最終状態として宣言されたオブジェクトメソッドの意味
以下の方法はjava.lang.Objectクラスでは最終finalとして宣言されているため、任意のインプリメンテーションで上書きすることはできません.

getClass 
notify 
notifyAll 
wait 

getClassのデフォルトの実装は、すべてのJavaオブジェクト(ローカルまたはリモート)に適用されます.この方法は、リモート・オブジェクトの場合、特別な実装は必要ありません.getClassメソッドがリモートstubで使用される場合、rmicによって生成されたstubオブジェクトの正確なタイプが報告されます.
なお、stubタイプは、ローカルインタフェースではなく、リモートオブジェクトが実装するリモートインタフェースのみを反映する.
java.lang.Objectのwaitメソッドとnotifyメソッドは、Java言語スレッドモデルコンテキストの待機と通知を処理します.リモートstubでこれらのメソッドを使用するとJavaスレッドモデルに違反しませんが、これらのメソッドの意味はローカルJavaオブジェクトで使用される場合とは異なります.
特に、これらの方法を使用する場合、リモート・サイトの実際のオブジェクトではなく、リモート・オブジェクトのクライアント・ローカル参照(stub)が操作されます.
8.2 RemoteCallインタフェース
RemoteCallは、リモート・オブジェクトのstubとskeletonで使用される抽象インタフェースであり、リモート・オブジェクトの呼び出しを実行します.
注意:JDK 1.2ではRemoteCallインタフェースの使用は奨励されていません.JDK 1.2 stubプロトコルもこのインタフェースを使用しなくなりました.現在、stubはJDK 1.2において、RemoteCallをパラメータとする必要がない新しいinvoke法を使用している.

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は出力ストリームを返します.stubはパラメータをグループ化するか、skeletonは結果をグループ化します.
メソッドreleaseOutputStream出力ストリームを解放します.一部の伝送では、これは放出ストリームをもたらす.
メソッドgetInputStreamはInputStreamを返します.stubは、結果をデアセンブリするか、skeletonはパラメータをデアセンブリします.
メソッドreleaseInputStream入力ストリームを解放します.これにより、一部の伝送が接続の入力端子を早期に解放することができる.
メソッドgetResultStreamは出力ストリームを返します(呼び出しに成功したタイトル情報を書き終わった後).リモートコールのたびに結果ストリームは1回しか取得できません.successが真の場合、グループ化する結果は正常に返されます.そうでなければ結果は異常です.リモートコールの結果ストリームが取得された場合、放出
StreamCorruptedException.
メソッドexecuteCallは、呼び出しを実行するために最善を尽くします.
メソッドdoneでは、リモートコールが完了した後にクリアできます.
8.3 RemoteRefインタフェース
インタフェースRemoteRefは、リモートオブジェクトのハンドルを表します.各stubには、参照の具体的な表現を含む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メソッドは、メソッド呼び出しエージェントをstub(obj)のリモートリファレンスに呼び出し、リファレンスがリモートホストへの接続を確立し、methodとパラメータparamsのいくつかの表現をグループ化し、メソッド呼び出しを使用してリモートホストと通信することを許可します.
このメソッドは、リモートホスト上に存在するリモート・オブジェクトのメソッド呼び出し結果を返すか、呼び出しに失敗したときにRemoteExceptionを放出し、リモート呼び出しに異常が放出されたときにアプリケーション・レベルの異常を放出します.なお、オペランド番号opnumは、伝送する方法を符号化するために使用できるハッシュメソッド署名を表す.
opnumの方法ハッシュは64ビット(長)整数であり、米国国家標準技術局(NIST)のセキュリティハッシュアルゴリズム(SHA−1)に基づいて、バイトストリームメッセージ要約の最初の2つの32ビット値で計算される.バイトストリームには、リモートメソッド名の後にメソッド記述子からなる文字列を含むUTF符号化(メソッドに関する)
記述子の説明は、Java仮想マシン仕様の4.3.3節を参照してください).ハッシュ値は、SHA−1ハッシュの第1および第2の32ビットから与えられる.
long hash = sha[1] << 32 + sha[0]
注意-JDK 1.2ではnewCall、invoke、doneメソッドの使用は奨励されません.rmic JDK 1.2 stubプロトコルバージョンで生成されたstubでは、これらのメソッドは使用されません.newCall、invoke、doneからなる呼び出しシーケンスは、Methodオブジェクトをパラメータとして使用する新しいinvokeメソッドに置き換えられました.
メソッドnewCallは、リモートオブジェクトobj上の新しいリモートメソッド呼び出しに対応する呼び出しオブジェクトを作成します.操作配列opには、リモートオブジェクト上で利用可能な操作が含まれている.オペランド番号opnumは、オペランド配列のインデックスです.
リモートコールの特定のアクションを指定します.オペレーション配列とインデックスを渡すと、stubジェネレータはオペレーションインデックスを割り当てて解釈できます.リモートリファレンスでは、呼び出しで符号化するために操作の説明が必要になる場合があります.
メソッドinvokeは、リモートコールを実行します.invokeはstubにキャプチャされずにスムーズに通過できる「ユーザ」異常を生成します.リモートコール中に例外が発生した場合、invokeは「ユーザー例外」またはRemoteExceptionが発生する前に接続をクリアすることに注意してください.
メソッドdoneでは、リモートリファレンスによる接続の消去(または再使用)を許可します.doneは、invoke呼び出しが正常に(異常ではない)stubに戻った場合にのみ呼び出されます.
メソッドgetRefClassは、ストリームoutにシーケンス化される参照タイプの非パケット限定クラスのフルネームを返す.
メソッドremoteHashCodeは、リモートオブジェクトのハッシュコードを返します.同じリモート・オブジェクトを参照する2つのリモート・オブジェクトstubには、同じハッシュ・コードがあります(ハッシュ・リストでリモート・オブジェクトをキー値としてサポートします).Remote Objectは、hashCodeメソッドの呼び出しをリモートリファレンスのremoteHashCodeメソッドに転送します.
メソッドremoteEqualsは、2つのリモートオブジェクトの等価性を比較します.2つのリモート・オブジェクトが同じリモート・オブジェクトを参照している場合は、等価とみなされます.
たとえば、2つのstubが同じリモートオブジェクトを参照する場合、それらは等価であるとみなされます.
RemoteObjectは、equalsメソッドの呼び出しをリモート参照のremoteEqualsメソッドに転送します.
メソッドremoteToStringは、リモートオブジェクトの参照を表すStringを返します.
8.4 Server Refインタフェース
インタフェースServer Refは、リモートオブジェクトによって実装されるサーバ側ハンドルを表します.

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検索またはクライアントstubオブジェクトの作成を実現します.パラメータdataには、エンドスローガンなどのオブジェクトをエクスポートするために必要な情報が含まれます.
メソッドgetClientHostは、現在のクライアントのホスト名を返します.リモート・オブジェクト呼び出しを現在処理しているスレッドによって呼び出されると、この呼び出しを実行するクライアント・ホスト名が返されます.現在のリモート・メソッド呼び出しがサービス・ステータスにない場合は、Server NotActiveExceptionが呼び出されます.
8.5 Skeletonインタフェース
インタフェースSkeletonは、rmicコンパイラによって生成されるskeletonの実装のみが可能です.リモート・オブジェクトのskeletonは、実際のリモート・オブジェクトの割り当て呼び出しを実現するサーバ側のエンティティです.
注意-JDK 1.2ではSkeletonインタフェースの使用は奨励されません.このインタフェースは、rmic stubコンパイラによって生成された1.1(および1.2でデフォルトrmic−vcompatによって生成された1.1対応skeleton)skeletonクラスごとに実現される.
JDK1.2互換バージョンでリモートメソッド呼び出しを割り当てるにはskeletonは必要ありません.互換性JDK 1を生成するには.2以降のstubは、オプション-v 1を使用してください.2のコマンドrmic.

package java.rmi.server; 

public interface Skeleton{ 
void dispatch(Remote obj, RemoteCall call, int opnum, long hash)throws Exception; 

Operation[] getOperations(); 
} 

dispatchメソッドは、callオブジェクトで得られた入力ストリームのパラメータをデアセンブルし、実際のリモートオブジェクト実装obj上のメソッド(オペランド番号opnumで表される)を呼び出し、戻り値をグループ化します.呼び出し中に例外が発生した場合、例外が放出されます.
getOperationsメソッドは、リモートオブジェクトメソッドを含むオペレーション記述子の配列を返します.
8.6 Operationクラス
クラスOperationには、リモートオブジェクトJavaメソッドの説明が含まれます.
注意-JDK 1.2ではOperationインタフェースの使用は奨励されていません.JDK 1.2 stubプロトコルは、既存のOperationをパラメータとするRemoteRefを使用する.invokeメソッド.
stubはJDK 1.2で新しいinvoke法を用い,Operationをパラメータとして必要としなくなった.

package java.rmi.server; 

public class Operation{ 

  public Operation(String op);

  public String getOperation(); 

  public String toString(); 
} 

Operationオブジェクトを構築する際には、通常メソッド署名が付きます.
メソッドgetOperationは、操作記述子の内容(初期化時に使用される値)を返します.
メソッドtoStringは、オペレーション記述子の文字列表現(通常はメソッド署名)も返します.