1

基本的な質問があります。同じインスタンスで実行されている 2 つの戦争の間で通信することは可能ですか?

別の方法として、スレッド A [デーモン] が A.war から実行/開始され、スレッド B [デーモン] が B.war から実行/開始され、両方の戦争が同じ tomcat インスタンスにデプロイされているとします。スレッド A とスレッド B の間で通信できますか? もしそうなら、どのようにそれが可能ですか [チュートリアルへのリンク]?

4

3 に答える 3

1

2 つの war にはそれぞれ独自の classLoader とコンポーネントがあるため、それらのいずれかでインスタンス化されたオブジェクトを簡単に共有することはできません。

2 つの典型的な方法があると思います。

  1. ある種の Web サービス (ソケット、RMI、HTTP などに基づく) を介したリモート アクセス。さまざまなインスタンスで戦争を展開することもできます.
  2. 通常は JNDI を介して、サーバー インスタンスによってリソースとして提供される必要がある共有コンポーネントを使用します。例として、Tomcat7 で dataSources を使用する方法を見てください(最も一般的な使用例)。
于 2013-06-24T13:01:43.787 に答える
1

設計上、2 つの Web アプリケーションは異なるクラスローダによって分離されており、互いのメモリ/クラスローダにアクセスできません。ただし、他の人が答えたように、これには特定の方法があります。根本的な要件によっては、さまざまなソリューションの長所と短所を受け入れる場合があります。

ただし、(基礎となるアプリケーションについて詳しく知らずに) クラスローダ マジックでそれらを再度結合するためだけにアプリケーション層を別の WAR ファイルに分離するのはやり過ぎであり、実装の詳細に頼りすぎる可能性があると私は主張します。

あなたの説明を考えると、おそらく 2 つのアプリケーション間で Web サービス レベルのアクセスを構成することでうまくいくでしょう。これについては、Web サービスのチュートリアルを参照してください。または、MessageBus のような実装を検討してください。

あなたの質問に基づいて提案するには重すぎるものは、Liferay のサービス ビルダーです。これは、特定の API 呼び出しのさまざまなアプリケーション コンテキストを抽象化し、別のアプリケーションを透過的に呼び出すことを可能にするコンポーネントです。ただし、Liferay にバインドされているため、探しているソリューションではない可能性があります。

于 2013-06-24T13:44:59.797 に答える
0

うまくいく可能性がある最も簡単な方法は、共有ライブラリ (jar) を共通のクラスローダーに入れることです (それがどのディレクトリであるかをすぐに覚えてはいけませんlib)。次に、BlockingQueues、Semaphores など、そこから得られるすべてのオプションに関して、好きなだけファンシーにすることができます。Typesクラスキャスト例外を避けるために、各アプリケーションとの間でシャッフルするものには注意してください。

于 2013-06-24T12:53:49.447 に答える