11

同じ桟橋コンテナで実行されている2つの戦争の間で低遅延の通信を実現するためにどのようなオプションがありますか?

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

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

サーブレット間の通信を見てきましたが、メソッドの直接呼び出しは非推奨になっているため、これは正しい選択ではないように思われますか?

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

私が探しているのは、Apache CamelのVMコンポーネント( Webアプリケーション間のセダ)のようなものですが、アプリケーションの1つだけがCamelを使用しているため、これはオプションではありません。

戦争の合間にいくつかのDTOを共有する必要があるかもしれないことは知っていますが、サービスを共有ライブラリに取り込むことを提案しないでください。それがオプションである場合は、この質問をしません:)

編集:

EJBコンテナを埋め込むこともおそらくオプションではありません。

4

3 に答える 3

5

インターフェイスをJNDIに登録し、グローバルにして、「他の」サーブレットがリポジトリからインターフェイスを取得できるようにします。

これを確認してください

(注:独自のレジストリ実装を優先してJNDIを放棄しましたが、レジストリとJettyを同じJVMでプログラムで開始します)

于 2012-03-20T17:13:05.480 に答える
3

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

以下は作業コードです。Peer 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 */
于 2013-10-31T08:21:32.337 に答える
2

ローカルインターフェイスを備えたEJBとしてサービスを公開することは1つのオプションです。この標準は、アプリケーション間で実行されたときにこれが直接呼び出しとして実装されることを保証していませんが、ほとんどのアプリサーバーはそのように実装しているようです。Jettyで実行するには、OpenEJBJBoss embeddable 、Spring'sPitchforkなどの埋め込み可能なEJBコンテナーを使用する必要があります。

于 2012-03-20T09:19:00.060 に答える