2012-03-20 9 views
10

同じ埠頭内で実行されている2つの戦争の間に低遅延の通信を実現するには、どのようなオプションがありますか?同じコンテナ内の戦争中のプロセス間通信

私は基本的に、ある戦争では他の戦争でサービスを呼び出す必要がありますが、それをWebサービスとして呼び出すオーバーヘッドはありません。

同じJVMで実行されているので、私はRMI/JMSなどの使用を避けたいと考えていますが、他にどのようなオプションがあるのか​​わかりません。

私はサーブレット間の通信を見てきましたが、ダイレクトメソッドの呼び出しは正しい選択ではないように思われるdeprecatedですか?

私はkyronetも見つけましたが、これは同じJVMにあるので、より良い解決策がありますか?私が探している何

は、ApacheキャメルのVM Component(ウェブ・アプリケーション間のseda)のようなものですが、アプリケーションの一つだけが、このためにキャメルを使用しているので、オプションではありません。

私は、私はいくつかのDTOの戦争の間を共有する必要があります知っているが、それは私がこの質問をされることはない:)

オプションだった場合、共有ライブラリにサービスを引っ張って提案しないでください編集:

おそらくEJBコンテナを埋め込むこともできません。

答えて

5

登録はJNDIとのインターフェイスであり、 'other'サーブレットがそれらをリポジトリから取得できるようにグローバルにします。

チェックthis

(注意:私たちは私たち自身のレジストリの実装に賛成してJNDIをあきらめたが、我々は同じJVMでプログラムレジストリを起動し、桟橋)

+0

お返事ありがとうございます! JettyのJNDIサポートをなぜ放棄しましたか?独自のNamingManagerを実装しましたが、Context APIを使用しましたか、JNDIをすべて削除しましたか?問題をJettyに登録する方法を説明するリソースを教えてください。ああ、そして最後に、このソリューションを介して転送されたオブジェクトは、参照渡しまたはシリアル化されていますか? – ebaxt

+0

オブジェクトインスタンスが直接参照できるように、 'reference'を渡します。 JNDIは問題ありません。いくつかの情報[link](http://docs.codehaus.org/display/JETTY/JNDI)でこのリンクを試してみてください。私たちはそれを落とした理由は2つありました。柔軟性(固定インタフェース、クエリ機能、ランタイム登録を持つ複数のレジストリ)とよりリーンなパッケージ(JNDIは一般的であり、我々が必要としない機能を提供する)でした。レジストリを実装するには、webappのライフサイクルを適切に処理する必要がありますが、それは簡単ではないかもしれません。 –

+0

恐ろしい、ありがとう! – ebaxt

2

サービスをローカルインタフェースを備えたEJBとして公開することが1つの選択肢になります。この規格は、アプリケーション間で行われたときに直接コールとして実装されることを保証するものではありませんが、apparently most app servers implement it that wayです。 Jettyで実行するには、OpenEJBJBoss embeddable、またはSpring's Pitchforkなどの埋め込み可能なEJBコンテナを使用する必要があります。

+0

感謝を!私たちはカスタム埋め込みJettyラッパーに基づいた大きなSOAデプロイメントを持っているので、EJBコンテナを埋め込むことは私のマネージャーと一緒に飛ぶつもりはありません。 – ebaxt

+0

@ebaxt:私は10年前からラベル "EJB"とその評判が悪いと思う。他に単純な解決策が見つからない場合は、試してみる価値があります。 –

+0

はい、おそらく両方の点で正しいです;) – ebaxt

1

2つの間で「通信」することが可能ですServletContext.getContext(String uriPath)およびRequestDispatchers(またはServletContextリスナー)を使用して、同じ場所に配置されたWebアプリケーションを作成できます。

ピアReyndersによって推奨

http://www.coderanch.com/t/222608/Web-Services/java/communicate-war-files

後のサンプル動作するコードである私が試した:)

public void doGet(HttpServletRequest Prequest, HttpServletResponse Presponse) 
    throws IOException, ServletException { 

    ServletContext sc = getServletContext().getContext("/war2"); 
    RequestDispatcher rd = sc.getRequestDispatcher("/LoginHandler?UserId=DummyUser"); 
    rd.forward(Prequest, Presponse); 
} /* End of doGet */