RMI(リモートメソッド呼び出し)
RMI(リモートメソッド呼び出し)は、javaで分散アプリケーションを作成するメカニズムを提供するAPIです。 RMIは、オブジェクトが別のJVMで実行されているオブジェクトのメソッドを呼び出すことを可能にします。
RMIは、二つのオブジェクトスタブとスケルトンを使用してアプリケーション間のリモート通信を提供します。
スタブとスケルトンの理解
RMIは、リモートオブジェクトとの通信にスタブとスケルトンオブジェクトを使用します。
リモート-オブジェクトは、別のJVMからメソッドを呼び出すことができるオブジェクトです。 スタブとスケルトンオブジェクトを理解しましょう:
スタブ
スタブはオブジェクトであり、クライアント側のゲートウェイとして機能します。 すべての送信要求は、それを介してルーティングされます。 これはクライアント側に存在し、リモートオブジェクトを表します。 呼び出し元がスタブオブジェクトのメソッドを呼び出すと、次のタスクが実行されます:
- リモート仮想マシン(JVM)との接続を開始し、
- リモート仮想マシン(JVM)にパラメータを書き込み、送信(マーシャリング)し、
- 結果を待機します
- 戻り値または例外を読み取り(マーシャリング)し、
- 最後に、値をリモート仮想マシン(jvm)に返します。発信者。
skeleton
skeletonはオブジェクトであり、サーバー側オブジェクトのゲートウェイとして機能します。 すべての着信要求はそれを介してルーティングされます。 スケルトンは、着信要求を受信すると、次のタスクを実行します:
- リモートメソッドのパラメータを読み取り、実際のリモートオブジェクトのメソッドを呼び出し、
- 結果を呼び出し元に書き込み、送信(マーシャリング)します。
Java2SDKでは、スケルトンの必要性を排除するスタブプロトコルが導入されました。
分散アプリケーションの要件を理解する
いずれかのアプリケーションがこれらのタスクを実行する場合、それは分散アプ
.
- アプリケーションはリモートメソッドを見つける必要があります
- リモートオブジェクトとの通信を提供する必要があり、
- アプリケーションはオブジ
RMIアプリケーションにはこれらの機能がすべて備わっているため、分散アプリケーションと呼ばれます。
Java RMIの例
には、RMIプログラムを書くための6つのステップが与えられています。
- リモートインターフェイスの作成
- リモートインターフェイスの実装を提供
- 実装クラスをコンパイルし、rmicツールを使用してスタブとスケルトンオブクライアントアプリケーション
rmiの例
この例では、rmiアプリケーションを作成して実行するための6つの手順をすべて実行しました。 クライアントアプリケーションに必要なのは、リモートインターフェイスとクライアントアプリケーションの2つのファイルだけです。 Rmiアプリケーションでは、クライアントとサーバーの両方がリモートインターフェイスと対話します。 クライアントアプリケーションはプロキシオブジェクトのメソッドを呼び出し、RMIはリモートJVMに要求を送信します。 戻り値は、プロキシオブジェクトに返され、次にクライアントアプリケーションに送信されます。
1)リモートインターフェイスの作成
リモートインターフェイスを作成するには、リモートインターフェイスを拡張し、リモートインターフェイスのすべてのメソ ここでは、リモートインターフェースを拡張するリモートインターフェースを作成しています。 Add()という名前のメソッドは1つだけで、RemoteExceptionを宣言します。
2)リモートインターフェイスの実装を提供
今、リモートインターフェイスの実装を提供します。 リモートインターフェイスの実装を提供するために、我々は
- いずれかのUnicastRemoteObjectクラスを拡張する必要があります、
- またはUnicastRemoteObjectクラスのexportObject()メソッドを使用します
3)rmicツールを使用してスタブオブジェクトとスケルトンオブジェクトを作成します。
次のステップは、rmiコンパイラを使用してスタブとスケルトンオブジェクトを作成することです。 RmicツールはRMIコンパイラを呼び出し、スタブオブジェクトとスケルトンオブジェクトを作成します。
4)rmiregistryツールを使用してレジストリサービスを開始
今rmiregistryツールを使用してレジストリサービスを開始します。 ポート番号を指定しない場合は、デフォルトのポート番号が使用されます。 この例では、ポート番号5000を使用しています。
5)サーバーアプリケーションを作成して実行する
今、rmiサービスは、サーバープロセスでホストされる必要があります。 Namingクラスには、リモートオブジェクトを取得および格納するメソッドが用意されています。 Namingクラスには5つのメソッドが用意されています。
パブリック静的java。rmiリモートルックアップ(java.ラング文字列)はjavaをスローします。rmiNotBoundException,java.net.MalformedURLException,java.rmiRemoteException; | リモートオブジェクトの参照を返します。 |
パブリック静的ボイドバインド(java。ラング文字列、java。rmiリモート)は、javaをスローします。rmiすでに、java.net…..MalformedURLException、java。rmiRemoteException; | 指定された名前でリモートオブジェクトをバインドします。 |
public static void unbind(java.ラング文字列)はjavaをスローします。rmiリモート例外、java。rmiNotBoundException,java.net.MalformedURLException; | 指定された名前でバインドされているリモートオブジェクトを破棄します。 |
public static void rebind(java.ラング文字列、java。rmiリモート)は、javaをスローします。rmiRemoteException,java.net.MalformedURLException; | リモートオブジェクトを新しい名前にバインドします。 |
パブリック静的java。ラング文字列リスト(java.ラング文字列)はjavaをスローします。rmiRemoteException,java.net.MalformedURLException; | レジストリにバインドされたリモート-オブジェクトの名前の配列を返します。 |
この例では、sonooという名前でリモートオブジェクトをバインドしています。
6)クライアントアプリケーションを作成して実行
クライアントでは、Namingクラスのlookup()メソッドによってスタブオブジェクトを取得し、このオブジェク この例では、サーバーとクライアントのアプリケーションを同じマシンで実行しているので、localhostを使用しています。 別のマシンからリモートオブジェクトにアクセスする場合は、localhostをリモートオブジェクトが配置されているホスト名(またはIPアドレス)に変更します。
このRMIの例の出力
データベースを使用したRMIアプリケーションの意味のある例
シナリオを考えてみましょう。 MachineAとMachineBとしましょう、machineAは米国にあり、MachineBはインドにあります。 MachineBは、MachineAアプリケーションのすべての顧客のリストを取得したいと考えています。
手順に従ってRMIアプリケーションを開発しましょう。
1)テーブルを作成する
まず、データベースにテーブルを作成する必要があります。 ここでは、Oracle10databaseを使用しています。
2)Customerクラスとリモートインターフェイス
File:Customerを作成します。java
注:Customerクラスは直列化可能でなければなりません。
ファイル:銀行。java
3)リモートインタフェース
File:BankImplの実装を提供するクラスを作成します。java
4)クラスrmicツールをコンパイルし、データベース”>
を使用してrmiregistryツール
6)クライアント
File:MyClientを作成して実行します。java