2009-07-16 27 views
2

Javaサーブレットでポート80を経由するようにRMIをセットアップしたいのですが(ファイアウォールを通過させる) 私はTomcatサーバーを持っています。 RMI HTTP要求を捕捉し、それをサーバマシン上のRMI層に渡します。 RMIがこれを自動的に処理することを読んだことがあります。Tomcatを使用してRMIをトンネリングするには

詳細な手順はありますか?または、サーバーにインストールするためのwarファイルのみ?

ありがとうございました。

答えて

3

プロダクションサーバーでこれを実行しましたが、これはずっと前です。最近は特にAJAXやWeb対応のアプリを使って、何をしているのかで、これはかなり珍しいことですが、インストールするwarファイルはありません。スケーラビリティと信頼性の理由から、インターネット経由でRMIを導入することはお勧めしません。 LANでもJVMでも素晴らしいですが、より広範なものであれば、可能ならばより一般的なWebサービスを検討したいと思います。

それ以外には、so-so guide hereがあります。 Tomcat 3のためのものですが、コンセプトは同じですが、サーブレットの使用にはかなり冗長なApacheとの統合について言及しています。つまり、すでに完全にau faitのTomcatであれば無視できます。

Tomcatにサーブレットをインストールすると、HTTPポストにピギーバックのあるRMIリクエストが展開され、ローカルレジストリが検索され、リモートメソッド呼び出しが完了します。また、あなたのセットアップをテストするための小さなデモサーバーとクライアントアプリケーションも提供しています。


編集コメントに応じて:

私は/cgi-bin/java-rmi.cgiを模倣しますが、それを使用するサーブレットを見つけた私はすべての要求を指示する必要がありますto/RMIServletを使用して、リダイレクトされていることをクライアントに知らせます。私はこれのためにたくさんのグーグルで探検し、数多くのソリューションを試しましたすべて成功なし。これを行う最善の方法は何ですか?

私は、これは通常のポート1099のルートをforgoes、代わりに/ポストHTTP上の要求を便乗RMIへのSocketFactoryを提供することにより、行われていると思います。

ソケットファクトリー自体は、次のようなものです。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() 
); 

クライアントでは、レジストリを見つけるときにソケットファクトリを指定できます。私は、クライアントをせずに/ RMIServletへのすべての要求を指示する必要があり、私は/cgi-bin/java-rmi.cgiを模倣しますが、それを使用するサーブレットを見つけた

Registry registry = LocateRegistry.getRegistry(
    loginHostName, 
    portNumber, 
    new RMIHttpToCgiSocketFactory() 
); 
+0

それがリダイレクトされていることを知っています。 私はこれについてたくさんのことを尋ね、数多くの解決策を試しました。すべて成功なし。 私の試みのほとんどは、Apacheとしてhttpd + tomcatをコネクターとして組み合わせたものです。 そこには成功しません。 (一言で言えば、jkmount、proxypass、rewriteを試しました) これを行う最も良い方法は何ですか? – Ben

+0

@Ben「リダイレクトされていることをクライアントに知らせない」とはどういう意味ですか?クライアントはこれを見ることはありません。厳密にはRMIソケットファクトリとTomcatの間にあります。 – EJP

+0

@EJPこれは3年前です。私が意味したことは、リダイレクトしてクライアントを転送しないことでした。 :-) – Ben

関連する問題