1

Javaサーブレットのポート80を通過するようにRMIを設定したい。(ファイアウォールを通過するため)Tomcatサーバーがあり、RMIhttpリクエストをキャッチしてそれをに渡すモジュールを探しています。サーバーマシンのRMIレイヤー。RMIがこれを自動的に処理することを読みました。

これへのステップバイステップガイドはありますか?または、サーバーにインストールするwarファイルだけですか?

ありがとう。

4

1 に答える 1

3

これは実稼働サーバーで実行しましたが、かなり前のことです。インストールするwarファイルはありません。これは非常に珍しいことであり、特に最近のAJAXやWeb対応アプリなどではそうです。スケーラビリティと信頼性の理由から、インターネット経由でRMIを展開することはお勧めしません。これはLAN全体、さらにはJVMでも優れていますが、より広いスケールでは、可能であれば、より従来型のWebサービスを検討したいと思います。

それはさておき、ここにまあまあのガイドがありますこれはTomcat3用ですが、概念は同じであり、サーブレットの使用にはかなり冗長なApacheとの統合について言及しているため、Tomcatにすでにかなり慣れている場合は、無視できるチャンクがあります。

これは、HTTP PostにピギーバックするRMI要求をアンパックし、ローカルレジストリを見つけて、リモートメソッド呼び出しを完了するサーブレットをTomcatにインストールする方法をガイドします。また、セットアップをテストするための小さなデモサーバーとクライアントアプリケーションも提供します。


コメントに応じて編集します。

/cgi-bin/java-rmi.cgiを模倣するサーブレットを見つけましたが、それを使用するには、リダイレクトされていることをクライアントに通知せずに、すべてのリクエストを/RMIServletに送信する必要があります。私はこれについてたくさんグーグルで検索し、多くの解決策を試しました。すべて成功せず。これを行うための最良の方法は何ですか?

これは、通常のポート1099ルートを放棄し、代わりにHTTP/PostでリクエストをピギーバックするSocketFactoryをRMIに提供することによって行われると思います。

ソケットファクトリ自体は次のようなものです。URLオブジェクトを変更するだけでHTTPSで動作させることができます。

public class RMIHttpToCgiSocketFactory extends RMISocketFactory implements Serializable {
    public static final long serialVersionUID = 1L;

    public RMIHttpToCgiSocketFactory(){}

    public Socket createSocket( String s, int i ) throws IOException {
        // Whacked out indentation for StackOverflow! Hope you can read this.
        return new HttpsSendSocket( 
            s, 
            i,
            new URL(
                "http", 
                s, 
                "/cgi-bin/java-rmi.cgi?forward="+i
            )
        );
    }

    public ServerSocket createServerSocket( int i ) {
        return null;
    }
}

ここで、RMI処理でこのソケットファクトリを使用するようにアプリケーションに指示する必要があります。私たちのコードベースでは、これはサーバーとクライアントの両方で行われます。サーバー側では、RMIサービスがそれ自体をレジストリにバインドしているときに、オブジェクトをエクスポートしてリモートスタブを取得するときにクライアントソケットファクトリを指定できます。

RMIClientSocketFactory clientSocketFactory = new RMIHttpToCgiSocketFactory();
Remote stub = UnicastRemoteObject.exportObject( 
    server, 
    port, 
    clientSocketFactory, 
    RMISocketFactory.getDefaultSocketFactory() 
);

また、クライアントでは、レジストリを検索するときにソケットファクトリを指定できます。

Registry registry = LocateRegistry.getRegistry(
    loginHostName, 
    portNumber, 
    new RMIHttpToCgiSocketFactory()
);
于 2009-07-17T08:00:08.807 に答える