Javaリモートメソッド呼び出し

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
スタブオブジェクトスケルトンオブジェクトを使用したJava-RMIの典型的な実装モデルJava 2 SDK、Standard Edition、v1.2では、スケルトンが不要になりました。

計算Javaリモートメソッド呼び出しJava RMIは)でのJava API実行するリモートメソッド呼び出しのオブジェクト指向同等のリモート・プロシージャ・コールの直接転送をサポートする(RPC)、シリアライズJavaクラスおよび分散ガベージコレクション

元の実装は、Java仮想マシン(JVM)のクラス表現メカニズムに依存しているため、あるJVMから別のJVMへの呼び出しのみをサポートします。このJavaのみの実装の基礎となるプロトコルは、Java Remote Method Protocol(JRMP)として知られています。非JVMコンテキストで実行されるコードをサポートするために、プログラマーは後でCORBAバージョンを開発しました。

RMIという用語の使用は、プログラミングインターフェイスのみを表す場合もあれば、APIとJRMP、IIOP、または別の実装の両方を表す場合もありますが、 RMI-IIOP(RMI over IIOP)という用語は、ほとんどの機能をサポートするCORBA実装。

Java RMI、分散ガベージコレクション(DGC)プロトコル、および元のSun実装の基礎となるアーキテクチャの多くの基本的な考え方は、Modula-3の「ネットワークオブジェクト」機能に由来します

一般化されたコード

元のRMIAPIのプログラマーは、HTTPトランスポートなどのさまざまな実装をサポートするために、コードをある程度一般化しましたさらに、RMIインターフェースとの互換性を保つために、引数を「値で渡す機能がCORBAに追加されました。それでも、RMI-IIOPとJRMPの実装には完全に同一のインターフェースがありません。

RMI機能はパッケージjava.rmiに含まれていますが、Sunの実装のほとんどはsun.rmiパッケージに含まれています。Java 5.0より前のJavaバージョンでは、開発者はを使用して別のコンパイル手順でRMIスタブをコンパイルする必要があったことに注意してくださいrmicJavaのバージョン5.0以降では、この手順は不要になりました。

Jiniバージョン

Jiniは、Javaでより高度なバージョンのRMIを提供します。同様に機能しますが、分散オブジェクトアプリケーションに対して、より高度なセキュリティ、オブジェクト検出機能、およびその他のメカニズムを提供します。[1]

次のクラスは、メッセージを表示するRMIを使用して単純なクライアントサーバープログラムを実装します。

RmiServerclass — RMI要求をリッスンし、クライアントがリモートメソッドを呼び出すために使用するインターフェイスを実装します。

 java.rmi.Namingをインポートします; 
import  java.rmi.RemoteException ; 
import  java.rmi.server.UnicastRemoteObject ; 
importjava.rmi.registry  。* ;

public  class  RmiServer  extends  UnicastRemoteObjectimplements  RmiServerIntf  { public static final  String MESSAGE = "Hello World " ;
          

    public  RmiServer ()は RemoteException { super 0 );をスローします。 // 'rmic'ステップを回避するために必要です。以下を参照してください} 
         
    

    public  String  getMessage () { 
        return  MESSAGE ; 
    }

    public  static  void  main String  args [] )は Exception { Systemをスローします アウトprintln "RMIサーバーが起動しました" ); 
        

         {  //レジストリ作成用の特別な例外ハンドラ
            LocateRegistryを試してくださいcreateRegistry 1099 ); 
            システムアウトprintln "java RMIレジストリが作成されました。" ); 
        }  catch  RemoteException  e  { 
            //何もしない、エラーはレジストリがすでに存在することを意味します
            System アウトprintln "java RMIレジストリはすでに存在します。" ); 
        }
           
        // RmiServerをインスタンス化し
        ますRmiServerserver  = new RmiServer ();   

        //このオブジェクトインスタンスを「RmiServer」
        ネーミングという名前にバインドします再バインド"// localhost / RmiServer"  server ); 
        システムアウトprintln "レジストリにバインドされたPeerServer" ); 
    } 
}

RmiServerIntfinterface —クライアントによって使用され、サーバーによって実装されるインターフェイスを定義します。

import  java.rmi.Remote ; 
import  java.rmi.RemoteException ;

パブリック インターフェイス RmiServerIntfextends  Remote  { String getMessage  throws RemoteException ; }
       

RmiClientクラス—これは、サーバー上に存在するリモートオブジェクトへの参照(プロキシ)を取得し、そのメソッドを呼び出してメッセージを取得するクライアントです。サーバーオブジェクトがjava.rmi.Remoteではなくjava.io.Serializableを実装している場合、サーバーオブジェクトはシリアル化され、値としてクライアントに渡されます。[2]

 java.rmi.Namingをインポートします;

public  class  RmiClient  { 
    public  static  void  main String  args []  throws  Exception  { 
        RmiServerIntf  server  =  RmiServerIntf Naming ルックアップ"// localhost / RmiServer" ); 
        システムアウトprintln サーバー。getMessage )); 
    } 
}

この例を実行する前に、使用したインターフェースの「スタブ」ファイルを作成する必要があります。このタスクには、RMIコンパイラがあります-'rmic '

  • 注:「*。java」ファイルからではなく、リモートインターフェースの実装を使用して「* .class」ファイルからスタブファイルを作成します。
rmic RmiServer

動的に生成されたスタブファイルのバージョン5.0のサポートが追加されたため、rmicは、以前のランタイムとの下位互換性[3]、またはエクスポート時に明示的なポート番号(またはゼロ)を提供しないプログラムに対してのみ提供されることに注意してください。 UnicastRemoteObjectのJavadocで説明されているように、生成されたスタブを可能にするために必要なリモートオブジェクト。上記のコンストラクターのコメントを参照してください。

参考文献

  1. ^ テイラー、イアンJ(2005)。P2PからWebサービスおよびグリッドへ:クライアント/サーバーの世界のピアコンピュータ通信とネットワーク。ロンドン:Springer-Verlag。土井10.1007 / b138333ISBN 1852338695OCLC827073874 _[必要なページ]
  2. ^ ウィルソン、M。ジェフ(2000年11月10日)。「プロキシとRMIで賢くなりましょう」JavaWorld2020年7月18日取得
  3. ^ 「JavaRMIリリースノート」Oracle 2012年5月9日取得

外部リンク