1

ユーザーが外部リソースへのリクエストをトリガーできるようにするWebアプリケーションがあります。外部リソースは、結果を収集するために不特定の時間を費やすため、更新を取得し、完了時に最終結果を収集するために、外部リソースをポーリングする必要があります。

ユーザーがリクエストをトリガーするとキューに追加され、ユーザーが他のことをしている間に、多数のワーカースレッドが各リクエストを取得してポーリングを実行するようにします。

日中のリクエスト数は大きく異なるため、遅いときに多くのワーカーが何もしないのはリソースの無駄になると考えられますが、同時に、ピーク負荷を処理するのに十分なワーカーが必要です。システム。

待機中のリクエストが多い場合はワーカーを追加できるものが必要ですが、やることがほとんどない場合はワーカーを強制終了します。

EJBを使用してこれを行うことは可能でしたが、使用したくありません。また、JMSやその他の大規模なフレームワークを使用してこれを処理することは、すでに使用しているもの(Spring、Quartz、多くのApacheのもの)でない限り、使用したくありません。

EJBはこれをサポートしており、そこで見つかったより便利な機能の1つであるため、誰かがすでにこの問題を解決していると思います。提案?

4

2 に答える 2

7

ThreadPoolExecutorコアと最大プールサイズに適切な値でを使用します。

ただし、数百のアイドルスレッドを使用するのに大きなコストはかからないため、を使用することを検討できますExecutors.newFixedThreadPool()

于 2009-09-24T12:59:01.827 に答える
1

java.util.concurrent.ThreadPoolExecutorドキュメントから:

プールに現在corePoolSizeを超えるスレッドがある場合、keepAliveTime(getKeepAliveTime(java.util.concurrent.TimeUnit)を参照)を超えてアイドル状態になっていると、余分なスレッドは終了します。これは、プールがアクティブに使用されていないときにリソース消費を削減する手段を提供します。後でプールがよりアクティブになると、新しいスレッドが構築されます。

したがって、最初にJava標準ライブラリを試してみることをお勧めします。パラメータを少し調整する必要がありますが、スレッドプールはそのままで高度に構成可能です。

于 2009-09-24T13:07:18.463 に答える