Java-rmi-introduction
Java RMI-はじめに
RMIは Remote Method Invocation の略です。 これは、あるシステム(JVM)に存在するオブジェクトが別のJVMで実行されているオブジェクトにアクセスしたり呼び出したりできるようにするメカニズムです。
RMIは、分散アプリケーションの構築に使用されます。 Javaプログラム間のリモート通信を提供します。 パッケージ java.rmi で提供されます。
RMIアプリケーションのアーキテクチャ
RMIアプリケーションでは、* serverプログラム*(サーバーに常駐)と* clientプログラム*(クライアントに常駐)の2つのプログラムを作成します。
- サーバープログラム内で、リモートオブジェクトが作成され、そのオブジェクトの参照がクライアントで利用可能になります(レジストリを使用)。
- クライアントプログラムは、サーバー上のリモートオブジェクトを要求し、そのメソッドを呼び出そうとします。
次の図は、RMIアプリケーションのアーキテクチャを示しています。
このアーキテクチャのコンポーネントについて説明しましょう。
- トランスポート層-この層はクライアントとサーバーを接続します。 既存の接続を管理し、新しい接続を設定します。
- スタブ-スタブは、クライアントでのリモートオブジェクトの表現(プロキシ)です。 クライアントシステムに存在します。クライアントプログラムのゲートウェイとして機能します。
- スケルトン-これはサーバー側にあるオブジェクトです。 *スタブ*はこのスケルトンと通信して、リモートオブジェクトにリクエストを渡します。
- * RRL(Remote Reference Layer)*-クライアントがリモートオブジェクトに対して行った参照を管理するレイヤーです。
RMIアプリケーションの動作
次のポイントは、RMIアプリケーションがどのように機能するかをまとめています-
- クライアントがリモートオブジェクトを呼び出すと、スタブが受信し、最終的にこのリクエストをRRLに渡します。
- クライアント側のRRLは、リクエストを受信すると、オブジェクト remoteRef の* invoke()*というメソッドを呼び出します。 サーバー側のRRLに要求を渡します。
- サーバー側のRRLはリクエストをSkeleton(サーバー上のプロキシ)に渡し、Skeletonは最終的にサーバー上の必要なオブジェクトを呼び出します。
- 結果はクライアントに戻されます。
マーシャリングとアンマーシャリング
クライアントがリモートオブジェクトのパラメーターを受け入れるメソッドを呼び出すたびに、パラメーターはネットワークに送信される前にメッセージにバンドルされます。 これらのパラメーターは、プリミティブ型またはオブジェクトの場合があります。 プリミティブ型の場合、パラメーターがまとめられ、ヘッダーが付加されます。 パラメータがオブジェクトの場合、それらはシリアル化されます。 このプロセスは*マーシャリング*として知られています。
サーバー側では、パックされたパラメーターがアンバンドルされ、必要なメソッドが呼び出されます。 このプロセスは「アンマーシャリング」として知られています。
RMIレジストリ
RMIレジストリは、すべてのサーバーオブジェクトが配置される名前空間です。 サーバーがオブジェクトを作成するたびに、このオブジェクトをRMIregistryに登録します(* bind()または reBind()*メソッドを使用)。 これらは、*バインド名*と呼ばれる一意の名前を使用して登録されます。
リモートオブジェクトを呼び出すには、クライアントはそのオブジェクトの参照を必要とします。 その時点で、クライアントはバインド名を使用して(* lookup()*メソッドを使用して)レジストリからオブジェクトをフェッチします。
次の図は、プロセス全体を説明します-
RMIの目標
RMIの目標は次のとおりです-
- アプリケーションの複雑さを最小限に抑えるため。
- 型の安全性を保つため。
- 分散ガベージコレクション。
- ローカルオブジェクトとリモートオブジェクトの操作の違いを最小限に抑えます。