3

サードパーティのサイトからのコールバックを処理するサーブレット S があります。

コールバックの呼び出しは、特定の順序で発生します。したがって、それらをキューに入れる必要があります。

次のようなメモリ内キューを使用することを提案します

java.util.ConcurrentLinkedQueue

したがって、ロジックは次のようになります。

  • サーブレット S はコールバックを受信し、受信したアイテムをキュー Q に入れます。
  • この時点で、サーブレット S のインスタンスをホストしていたスレッドは終了しています。
  • コンシューマ スレッドは Q から読み取り、それぞれを順次処理します。

私が理解しているように、サーブレット S の各インスタンスは独自のスレッドで実行されます。

Queue にサービスを提供する webapp (war) 全体に対して単一の Consumer Thread を作成するにはどうすればよいですか? 基本的に、次のシングルトン インスタンスが必要です。

  1. スレッドプール
  2. ConcurrentLinkedQueue
4

5 に答える 5

5

これは、サーブレット コンテナの用途ではありません。標準ベースのアプローチを使用する場合は、より本格的な J2EE アプリケーション サーバーが本当に必要です。それ以外の場合はハックになりますが、タスクには十分かもしれません。

私がおそらく試みることは、DaemonServlet の作成です。これは、URL にマップされていない通常のサーブレットです (おそらく、監視目的のブラインド URL を除きますが、この種のことには JMX が好まれます)。このinit()メソッドは、サーブレットがロードされるときに呼び出されます。その中でスレッドを開始できます。おそらく、2 つ作成する必要があるかもしれません。もう 1 つは、最初の 1 つが実行されていることを確認し、destroy()呼び出されると正常に終了します。

別の方法として、Spring を使用している場合(実際、Spring を使用しないのはどのようなものでしょうか?)、Spring のライフサイクル イベントを除いて、ほとんど同じことを行うアプリケーション コンテキストで Bean を単純に作成できます。 (たとえば、InitializingBean の afterPropertiesSet())。

実は、もっと良い提案があります。非同期メッセージ コンシューマーを使用します。これは、はるかにクリーンでスケーラブルですが、これはただのソリューションではなく、 JMSLinkedBlockingQueueベースのソリューションに基づいています(いずれにせよ、JMS はおそらくより良いアイデアです)。ただし、制約によっては、オプションとして JMS を使用できない場合があります。

于 2008-12-26T02:01:44.567 に答える
2

サーブレットは別々のスレッドにありますが、同じ VM インスタンスにあるため、共有メモリ空間に存在していることに注意してください。シングルトン インスタンスを作成すると、すべてのサーブレットで自動的に共有されます。共有データとして機能する別のサーブレットを作成することもできます。これには、必要に応じてコンテナー サービスを使用して永続化できるという利点があります。

これを行う方法 (専門的には「サーブレット コラボレーション」と呼ばれる) の徹底的な調査が、サーブレット プログラミングに関する OReilly の本でオンラインで入手できます

于 2008-12-26T01:58:05.680 に答える
1

ああ、もう 1 つの考え: やりたくないことの 1 つは、サーブレット コンテナー内で独自のスレッド プールを管理しようとすることです。あなたがそれを台無しにしない限り、それはあなたができるよりもはるかに優れたスレッドプーリングを行うことができます.

于 2008-12-26T01:59:37.877 に答える
0

独自のスレッド プールを管理するのは良くないというコメントには賛成です。

サーブレットは HTTP リクエストを処理するためのものです。HTTP は同期要求/応答プロトコルです。それらがどのように処理されるかのロジックは、別の場所に属します。そのハンドラーは同期または非同期の場合がありますが、それはハンドラーの実装に依存する必要があります。サーブレットは、特定の応答に対してどのハンドラーを延期するかを決定する必要があり、それだけです。

Tomcat またはサーブレット/JSP エンジンを使用している場合でも、Tomcat 実装に ActiveMQ を追加することで、Spring、JMS、および MDP を引き続き使用できます。

于 2008-12-26T02:26:17.807 に答える