2009-09-17 14 views
12

私は、通常の要求 - 応答処理に加えて、重要なバックグラウンド処理部分を持つかなり複雑なJavaサーバーアプリケーションを作成しています。バックグラウンド処理の一部は、Quartzフレームワークを使用してcronのような方法で行われます。他のタスクはオンデマンドであり、新しいクライアントが接続すると、それをしばらく更新する追加のジョブが作成されます。 cronタスクは、外部アプリケーションの監視や統計の計算など、さまざまに変更することもできます。Javaサーバー用の単一または複数のスレッドプール?

私は、同様のジョブがスレッドプールを共有するという考えで、これらすべてのジョブを実行するスレッドプールの数を使用していますが、異なるジョブは、1を共有することはありません。例えば、モニター・ジョブは統計プール上では決して実行されず、統計ジョブはモニター・プール上で決して実行されません。一方

私は何人かの人々が1つだけのスレッド・プールを持ち、任意の分離することなく、それのすべてを実行することを好むだろう知っています。

このようなシナリオでは、何がベストプラクティスと考えられるのだろうか。

スレッドプールを分離する際の長所は何ですか?

それは問題ですか?

+2

+1興味深い質問です。 – KLE

答えて

0

私はあなたにいくつかのUIを作成しますね。それは本当に、直接答えではないのですが、別の提案

:-(あなたのクォーツジョブは、一時停止キャンセルなど、の「 管理」と呼んでみましょうすることができますそれらを管理する。

あなたはもちろん、それを実装していない限り、あなた(「オンデマンド」)あなたの他のジョブは、同じ機能の恩恵を受けないであろうことを実現していますか?あなたはすべて石英ジョブ(でもそれならばを行うことを検討しましたすぐに開始されます)、均一なコードを取得しますか?

+0

これは実際にはオプションの1つです。しかし、2つの問題があります.1つは、AFAIK Quartzが1つのスレッドプールを使用するように強制することです。私の個人的な好みはmultipleを使用することです。第二に、Quartz APIはcronタイプのジョブからは優れていますが、並列でいくつかのアルゴリズムをすばやく実行する必要がある場合は面倒です。 –

+0

@ Gregory私はあなたのスレッドプール番号の懸念を理解しています。私はこの点について勧告をしていません:-(厄介なクォーツについては、私がそれを使って作業したときの私の感情です:-)私はこれを自家製の簡単な方法にカプセル化しました。 – KLE

+0

正直言って、クラスタ上のQuartzにも問題があります。ジョブは、要求を処理しているサーバーではなく、どこからでも開始されます。Quartzは起動している最初のノードで起動され、他のノードは起動しないと思います。これはいくつかの問題につながります... – KLE

6

答えは、さまざまなタイプのアクティビティ間でアプリケーションリソースを分離する必要があるかどうかによって異なります。

例えば、私は現在、いくつかのハイスループット作家や潜在的に多くの読者からなるサーバ・アプリケーションを書いています。読者はアプリに散発的にアクセスしますが、大量のデータを要求する可能性があります(長時間実行するリクエストなど)。私は、ライターが飢えていることがないように、私のデザインで2つのスレッドプールを使用して読み書きをするつもりです。リーダースレッドプールが一時的に使い果たされた場合、ライターは影響を受けません。読み取り要求のみが遅延します。

代替方法は、ThreadPoolExecutorと組み合わせてPriorityQueueを使用し、書き込み要求に高い優先度を割り当てることでした。

だから、結論に - 私のアドバイスは、次のようになります。一つのスレッド・プールをオフに開始し、そうするための具体的な理由がある場合にのみ、あなたのデザインをより複雑にします。

関連する問題