Java-rmi-quick-guide
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の目標は次のとおりです-
- アプリケーションの複雑さを最小限に抑えるため。
- 型の安全性を保つため。
- 分散ガベージコレクション。
- ローカルオブジェクトとリモートオブジェクトの操作の違いを最小限に抑えます。
Java RMIアプリケーション
RMI Javaアプリケーションを作成するには、以下に示す手順に従う必要があります-
- リモートインターフェイスを定義する
- 実装クラス(リモートオブジェクト)を開発する
- サーバープログラムを開発する
- クライアントプログラムを開発する
- アプリケーションをコンパイルする
- アプリケーションを実行する
リモートインターフェイスの定義
リモートインターフェイスは、特定のリモートオブジェクトのすべてのメソッドの説明を提供します。 クライアントはこのリモートインターフェイスと通信します。
リモートインターフェイスを作成するには-
- パッケージに属する事前定義されたインターフェース Remote を拡張するインターフェースを作成します。
- このインターフェイスでクライアントが呼び出すことができるすべてのビジネスメソッドを宣言します。
- リモート呼び出し中にネットワークの問題が発生する可能性があるため、 RemoteException という名前の例外が発生する場合があります。投げて。
以下は、リモートインターフェイスの例です。 ここでは、 Hello という名前のインターフェイスを定義し、* printMsg()*というメソッドを持っています。
実装クラスの開発(リモートオブジェクト)
前の手順で作成したリモートインターフェイスを実装する必要があります。 (実装クラスを個別に記述するか、サーバープログラムにこのインターフェイスを直接実装させることができます。)
実装クラスを開発するには-
- 前の手順で作成したインターフェイスを実装します。
- リモートインターフェイスのすべての抽象メソッドに実装を提供します。
以下は実装クラスです。 ここでは、 ImplExample という名前のクラスを作成し、前の手順で作成したインターフェイス Hello を実装し、メッセージを出力するこのメソッドに body を提供しました。
サーバープログラムの開発
RMIサーバープログラムは、リモートインターフェイスを実装するか、実装クラスを拡張する必要があります。 ここで、リモートオブジェクトを作成し、それを RMIregistry にバインドする必要があります。
サーバープログラムを開発するには-
- リモートオブジェクトを呼び出すクライアントクラスを作成します。
- 以下に示すように実装クラスをインスタンス化することにより、リモートオブジェクトを作成します。
- パッケージ java.rmi.server に属する UnicastRemoteObject という名前のクラスのメソッド* exportObject()*を使用して、リモートオブジェクトをエクスポートします。
- パッケージ java.rmi.registry に属する LocateRegistry クラスの* getRegistry()*メソッドを使用して、RMIレジストリを取得します。
- Registry という名前のクラスの* bind()*メソッドを使用して、作成されたリモートオブジェクトをレジストリにバインドします。 このメソッドには、バインド名とエクスポートされたオブジェクトを表す文字列をパラメーターとして渡します。
以下は、RMIサーバープログラムの例です。
クライアントプログラムの開発
その中にクライアントプログラムを記述し、リモートオブジェクトをフェッチし、このオブジェクトを使用して必要なメソッドを呼び出します。
クライアントプログラムを開発するには-
- リモートオブジェクトを呼び出すつもりのクライアントクラスを作成します。
- パッケージ java.rmi.registry に属する LocateRegistry クラスの* getRegistry()*メソッドを使用して、RMIレジストリを取得します。
- パッケージ java.rmi.registry に属するクラス Registry のメソッド* lookup()*を使用して、レジストリからオブジェクトを取得します。 +このメソッドには、バインド名を表す文字列値をパラメーターとして渡す必要があります。 これにより、リモートオブジェクトが返されます。
- lookup()は、リモートタイプのオブジェクトを返し、それをHelloタイプにダウンキャストします。
- 最後に、取得したリモートオブジェクトを使用して必要なメソッドを呼び出します。
次に、RMIクライアントプログラムの例を示します。
アプリケーションのコンパイル
アプリケーションをコンパイルするには-
- リモートインターフェイスをコンパイルします。
- 実装クラスをコンパイルします。
- サーバープログラムをコンパイルします。 *クライアントプログラムをコンパイルします。
Or,
すべてのプログラムを保存したフォルダーを開き、以下に示すようにすべてのJavaファイルをコンパイルします。
アプリケーションの実行
ステップ1 *-次のコマンドを使用して *rmi レジストリを起動します。
これにより、以下に示すように、別のウィンドウで rmi レジストリが開始されます。
- ステップ2 *-以下に示すようにサーバークラスファイルを実行します。
- ステップ3 *-以下に示すようにクライアントクラスファイルを実行します。
検証-クライアントを起動するとすぐに、サーバーに次の出力が表示されます。
Java RMI-GUIアプリケーション
前の章では、サンプルのRMIアプリケーションを作成しました。 この章では、クライアントがGUIウィンドウ(JavaFX)を表示するメソッドを呼び出すRMIアプリケーションを作成する方法について説明します。
リモートインターフェイスの定義
ここでは、 Hello という名前のリモートインターフェイスと、* animation()*という名前のメソッドを定義しています。
実装クラスの開発
このアプリケーションの実装クラス(リモートオブジェクト)では、JavaFXを使用して、GUIコンテンツを表示するウィンドウを作成しようとしています。
サーバープログラム
RMIサーバープログラムは、リモートインターフェイスを実装するか、実装クラスを拡張する必要があります。 ここで、リモートオブジェクトを作成し、それを RMIregistry にバインドする必要があります。
以下は、このアプリケーションのサーバープログラムです。 ここでは、上記で作成したクラスを拡張し、リモートオブジェクトを作成し、バインド名 hello でRMIレジストリに登録します。
クライアントプログラム
以下は、このアプリケーションのクライアントプログラムです。 ここでは、リモートオブジェクトを取得し、* animation()*という名前のメソッドを呼び出しています。
サンプルを実行する手順
RMIの例を実行する手順は次のとおりです。
- ステップ1 *-すべてのプログラムを保存したフォルダーを開き、以下に示すようにすべてのJavaファイルをコンパイルします。
ステップ2 *-次のコマンドを使用して *rmi レジストリを起動します。
これにより、以下に示すように、別のウィンドウで rmi レジストリが開始されます。
- ステップ3 *-以下に示すようにサーバークラスファイルを実行します。
- ステップ4 *-以下に示すようにクライアントクラスファイルを実行します。
検証-クライアントを起動するとすぐに、サーバーに次の出力が表示されます。
Java RMI-データベースアプリケーション
前の章では、クライアントがGUIウィンドウ(JavaFX)を表示するメソッドを呼び出すサンプルRMIアプリケーションを作成しました。
この章では、クライアントプログラムがサーバー上にあるMySQLデータベースのテーブルのレコードを取得する方法を確認する例を取り上げます。
以下に示すように、データベース details に student_data という名前のテーブルがあると仮定します。
ユーザーの名前が myuser で、パスワードが password であると仮定します。
学生クラスの作成
以下に示すように、 setter および getter メソッドで Student クラスを作成します。
リモートインターフェイスの定義
リモートインターフェイスを定義します。 ここでは、* getStudents()という名前のメソッドを含む *Hello という名前のリモートインターフェイスを定義しています。 このメソッドは、クラス Student のオブジェクトを含むリストを返します。
実装クラスの開発
クラスを作成し、上記で作成した* interface。*を実装します
ここでは、 Remote interface の* getStudents()メソッドを実装しています。 このメソッドを呼び出すと、 *student_data という名前のテーブルのレコードが取得されます。 setterメソッドを使用してこれらの値をStudentクラスに設定し、リストオブジェクトに追加して、そのリストを返します。
サーバープログラム
RMIサーバープログラムは、リモートインターフェイスを実装するか、実装クラスを拡張する必要があります。 ここで、リモートオブジェクトを作成し、それを* RMIレジストリ*にバインドする必要があります。
以下は、このアプリケーションのサーバープログラムです。 ここでは、上記で作成したクラスを拡張し、リモートオブジェクトを作成し、バインド名 hello でRMIレジストリに登録します。
クライアントプログラム
以下は、このアプリケーションのクライアントプログラムです。 ここでは、リモートオブジェクトを取得し、* getStudents()*という名前のメソッドを呼び出しています。 リストオブジェクトからテーブルのレコードを取得して表示します。
サンプルを実行する手順
RMIの例を実行する手順は次のとおりです。
- ステップ1 *-すべてのプログラムを保存したフォルダーを開き、以下に示すようにすべてのJavaファイルをコンパイルします。
ステップ2 *-次のコマンドを使用して *rmi レジストリを起動します。
これにより、以下に示すように、別のウィンドウで rmi レジストリが開始されます。
- ステップ3 *-以下に示すようにサーバークラスファイルを実行します。
- ステップ4 *-以下に示すようにクライアントクラスファイルを実行します。