目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
RMI のトランスポート層は通常、インターネット上のホストへ直接ソケットを開こうとします。しかし、多くのイントラネットはファイアウォールを備えているためこれができません。このため、デフォルトの RMI トランスポートでは、これに代わる 2 種類の HTTP ベースの機構を備えて、ファイアウォールの内側にあるクライアントが、ファイアウォールの外側にあるリモートオブジェクト上のメソッドを呼び出せるようにしています。
ファイアウォールの外側に到達できるように、トランスポート層はファイアウォール信任 HTTP プロトコルに、RMI 呼び出しを埋め込んでおきます。RMI 呼び出しのデータは、HTTP POST リクエストの本体として外側へ送り出され、返される情報も HTTP による応答本体の一部として組み込まれています。トランスポート層は、POST リクエストの形式を次の 2 つのどれかの方法で整えます。
1. | ホストマシンの任意のポートに向けられた HTTP リクエストをファイアウォールプロキシが転送する場合に、そのリクエストは RMI サーバが受信しているポートへ直接転送されます。サーバマシン上のデフォルトの RMI トランスポート層は、POST リクエストの中の RMI 呼び出しを理解してデコードできるサーバソケットを使って受信します。 |
2. | ファイアウォールプロキシが HTTP リクエストを既知の HTTP ポートにだけ転送する場合には、そのリクエストはホストマシン上のポート番号 80 で受信しているサーバへ転送され、CGI スクリプトが実行されて、その呼び出しを同じマシン上のターゲット RMI サーバのポートへ転送します。 |
RMI のトランスポートは java.rmi.server.RMISocketFactory クラスを拡張して、クライアントとサーバソケットへのリソースプロバイダとなるソケットファクトリのデフォルト実装を提供しようとします。このデフォルトソケットファクトリは、次に説明する方法で透過的なファイアウォールトンネリング機構を備えたソケットを作り出します。
このようなデフォルト動作をするクライアント側ソケットは、ファクトリのjava.rmi.server.RMISocketFactory.createSocket
メソッドが提供します。このようなデフォルト動作をするサーバ側のソケットは、ファクトリのjava.rmi.server.RMISocketFactory.createServerSocket
メソッドが提供します。
クライアント側では、ファイアウォールを通過して RMI 呼び出しを送るための特別な構成は必要ありません。しかし、クライアントは java.rmi.server.disableHttp プロパティのブール値を true に設定して RMI 呼び出しを HTTP リクエストの形式にパッケージするのを禁止させることができます。
注 - ホスト名は、ホストの IP アドレスとして指定されてはなりません。ファイアウォールプロキシの中には、そのような形式のホスト名を転送しないものがあるためです。
1. | サーバホストのドメインの外にあるクライアントが、あるサーバのリモートオブジェクトを呼び出せるためには、クライアントはまずそのサーバを見つけ出せなければなりません。このためには、サーバがエクスポートするリモート参照がそのサーバの完全修飾名を含んでいなければなりません。 |
サーバのプラットフォームとネットワーク環境によっては、サーバが実行中の Java Virtual Machine がこのような情報を利用できない場合があります。利用できないときは、ホストの完全修飾された名前はサーバがスタートする時点で java.rmi.server.hostname プロパティとして指定されていなければなりません。 |
たとえば、次のコマンドでマシン chatsubo.javasoft.com 上の RMI サーバクラス ServerImpl をスタートさせることができます。 |
java -Djava.rmi.server.hostname=chatsubo.javasoft.com ServerImpl
2. | サーバが、ファイアウォールの外側にある、任意のポートへ転送可能な RMI クライアントをサポートしない場合、次の構成を使うことができます。 |
a. | HTTP サーバはポート番号 80 を受信用に使用する |
b. | CGI スクリプトを次のエイリアス URL パスに置く |
/cgi-bin/java-rmi.cgi
- このスクリプトを次に示します。
- | ローカルな Java インタプリタを呼び出して、トランスポート層の中にあるクラスを実行してリクエストを適切に呼び出して RMI サーバポートへ転送する |
- | Java Virtual Machine のプロパティを、CGI 1.0 で定義される環境変数と同じ名前と値で定義する |
スクリプトの例は Solaris と Windows 32 オペレーションシステムの RMI ディストリビューションに含まれる。スクリプトはサーバマシン上の Java インタプリタへの完全なパスを指定することに注意してください。 |
HTTP リクエストを介して送信された呼び出しは、プロキシによる転送の時間のずれを除いたとしても、直接ソケットを介した場合よりもはるかに遅くなります。ファイアウォールを通す場合、HTTP リクエストは一方向でしか開始できないため、クライアントは自分のリモートオブジェクトをファイアウォールの外側へエクスポートすることはできません。これは、ファイアウォールの外側にあるホストが、内側にあるクライアントのメソッド呼び出しを開始できないためです。