HTTP による RMI のトンネル化の設定
Remote Method Invocation (RMI) は、1 つのオブジェクトからリモートオブジェクトにあるメソッドを同じ構文で直接起動できるようにする、Java のミドルウェアです。RMI では、基本となる通信を処理し、パラメータのアクセス方法を決定し、メソッド呼び出しに必要なデータのシリアル化を実現してクライアントとサーバー間でデータを転送できるようにします。
|
このセクションの情報は、HTTP と HTTPS の両方に関連しています。
|
Java 8 以下のバージョン
RMI サーバーのホストおよびポートとクライアントの間で直接の TCP/IP ソケット接続を確立できない場合は、RMI 呼び出しを HTTP プロトコルで転送できます。Java RMI 仕様はこのトンネル化に関して明記していますが、デフォルト Java 実装は一部の Java システムプロパティ設定に依存します。したがって、RMI は自動的にはフェイルオーバーしません。
Windchill 内部の RMI サーバーは、ソケットファクトリをコンフィギュレーション可能にしてこの制限を克服します。ソケットファクトリは、クライアントとサーバーの間の RMI 通信に使用されます。HTTP による RMI のトンネル化をサポートする Windchill ブートストラップパッケージ (boot.jar) に備えられたソケットファクトリを使用できます。Windchill RMI サーバーによってエクスポートされるソケットファクトリを制御する次のプロパティがデフォルトとして設定されています。
wt.rmi.clientSocketFactory=wt.boot.WTRMIMasterSocketFactory
|
HTTP による RMI のトンネル化は次の場合にのみ有効です。
• クライアント JAR の 1 つとして boot.jar が含まれている。
• boot.jar がクライアントのクラスパスにインストールされている (JRE の lib/ext ディレクトリなど)。
インストールされていない場合は、RMI サーバーのホストとポートへの直接の RMI ソケット接続のみがサポートされます。
|
Windchill には、ソケットファクトリ WTRMIMasterSocketFactory が含まれます。これにより、J2SE のデフォルトの接続フェイルオーバーロジックが以下のように改善されました。このソケットファクトリは、
• システムプロパティに関係なく HTTP および HTTPS による RMI 呼び出しのトンネル化をサポートします。
• Java RMI CGI と互換性のあるプロキシスクリプトのコンフィギュレーション可能な URL パスをサポートします。
• すべてのソケットファクトリに非同期の接続を試行して、初期接続における合計接続時間を短縮します。
WTRMIMasterSocketFactory は、一連のセカンダリソケットファクトリを使用して RMI サーバーに接続します。以下の場合に接続フェイルオーバーが使用されます。
1. WTRMIMasterSocketFactory には、必要な操作を実行するための特定の権限がありません。インストール済みのデフォルトソケットファクトリが代わりに使用されます。
2. wt.boot.socketFactory システムプロパティがクライアントで読み取られ、設定内に含まれる完全修飾クラスが RMISocketFactory のインスタンスを作成できる場合は、そのソケットファクトリがクライアントのサーバー通信に使用されます。
3. クライアントのコンフィギュレーション可能なソケットファクトリが失敗すると、そのソケットファクトリは直接ソケット接続を開始します (wt.boot.WrappedRMIDirectSocketFactory)。
4. 直接ソケット接続が失敗するか、フェイルオーバータイムアウトの時間 (wt.boot.failoverTimeout で定義される時間) 内に完了しなかった場合は、クライアントが HTTP プロキシサーバー (wt.boot.WrappedRMIHttpToPortSocketFactory) を使用していれば、ソケットファクトリが RMI ターゲットポートに対して HTTP 接続を開始します。
5. HTTP のポートへの接続が失敗するか、フェールオーバータイムアウトの時間内に完了しなかった場合は、クライアントコードベース (wt.boot.WTRMIHttpToCodebaseSocketFactory) で指定されるサーバーの Java RMI CGI ゲートウェイへの HTTP 接続が開始されます。
6. HTTP のコードベースへの接続が失敗するか、フェールオーバータイムアウトの時間内に完了しなかった場合は、デフォルト Java RMI CGI プロキシ (wt.boot.WrappedRMIHttpToCGISocketFactory および wt.boot.WTRMIHttpsToCGISocketFactory) への HTTP および HTTPS 接続 (任意) が同時に開始されます。
正常に完了した最初の接続タイプが使用され、結果として生じるソケットファクトリがそのホストへの今後の接続にすべて再使用されます。
Java RMI サーブレット
RMI サーバーへの直接接続が不可能な場合、Web サーバーは /cgi-bin/java-rmi.cgi へのリクエストに応答して、HTTP リクエストを転送できるようにする必要があります。実際の CGI ファイルは、Java SE Development Kit (JDK) で提供されます。Java RMI 仕様では、このファイルは Web サーバーの cgi-bin ディレクトリに追加されることになっています。wt.rmi.javarmicgi を別の URI に設定することによって、CGI ファイルを任意の場所に保管できます (/servlet/JavaRMIServlet など)。
パフォーマンス、セキュリティおよび柔軟性を向上させるため、Windchill は、同じ URL にマッピングできるサーブレットを提供します。サーブレットクラスは wt.tools.javarmi.JavaRMIServlet です。このクラスでは、事前に定義された範囲の宛先ポート番号に接続を転送するサーブレット初期化パラメータを通して構成できるようになるので、セキュリティが強化されます。ただし、JDK で提供される java-rmi.cgi ファイルを使用すると、HTTP リクエストがローカルホスト上のすべてのポート番号を識別できるようになるので、ほかのサービスが攻撃を受ける可能性が生じます。
パフォーマンスを向上させるため、wt.tools.javarmi.JavaRMIServlet は RMI 呼び出しのたびに新しいプロセスを開始しません。また、柔軟性を向上させるため、ローカルでない RMI サーバーホストにリクエストを転送し、RMI プロキシサーバーとして動作するように設定できます。サーブレットの各パラメータは、以下のとおりです。
• serverHost
• minPort
• maxPort
minPort および maxPort の値は、メソッドサーバーの RMI ポートに対する wt.properties 設定に基づいて自動的に計算されます。
Java 11
Java 11 以降では sun.rmi.transport.proxy パッケージが除去されたので、Windchill クライアントでの HTTP による RMI のトンネリングはサポートされていません。ただし、Java 9 以降では同様の機能が Spring Remoting を使用してサポートされています。Spring Remoting には、Java シリアル化オブジェクトをクライアントとサーバーの間でやり取りするための RMI メカニズムが備わっています。Java 11 JRE 以上が使用されているときに RMI ポートがブロックされている場合、フローは Spring Remoting に進みます。Sprint Remoting は HTTP POST リクエストを使用して Java シリアル化オブジェクトを転送します。