4

私は、非常に IO 集中型で、簡単に複数のタスクに分解できる Quartz のスケジュールされたジョブをいくつか持っています。

Spring のおかげで、ジョブは Tomcat Web コンテナー内でインスタンス化され、スケジュールされます。

java.util.concurrent API を Job クラス内および Java EE コンテナ内で使用してもよろしいですか?

FixedThreadPool を使用してサイジングし、いくつかのコア (この例では 2 つなど) を与えることで、Tomcat と論理プロセッサを共有できますか?

int numberOfCores = Runtime.getRuntime().availableProcessors();
final int poolSize = numberOfCores - 2 // Give away Two slots for TOMCAT
final ExecutorService executorPool = Executors.newFixedThreadPool(poolSize);
4

2 に答える 2

1

ええ、あなたはそれを行うことができます。しかし、仕事をTomcatの中に入れる前に。以下に注意してください。

Tomcat で Web アプリを使用していますか? はいの場合、Web アプリは非常にアクティブな高負荷ポータルですか?
はいの場合、スレッド ジョブは Tomcat サーバーから貴重な処理を奪います。

Job はスレッド ジョブによって実行されますか?それとも tomcat が必要ですか?
あなたの仕事が本当に依存している場合。別のバッチ サーバーを作成して使用することをお勧めします。実装については、Spring-Batch を参照してください。

于 2012-08-13T06:27:03.870 に答える
1

たぶん、慎重に。

スレッド (元のスレッド以外 - Web アプリ スレッドと呼びましょう) はコンテナーと確実にやり取りできないことに注意してください。一般に、Java EE ランタイムでスレッドを使用することはお勧めできません。しかし、それは前代未聞ではありません。

Tomcat オプション:

  1. Java EE には WorkManager API がありますtomcat には少なくとも1 つの実装があります。私はそれがどれほどうまく機能するかについて話すことはできません. この記事では、それについて詳しく説明します。

  2. 独自のスレッドを開始します。物事を管理する方法のモデルは、Swing Event Dispatch Loop with SwingUtilities.invokeLater(Runnable);かもしれません。あなたの場合、ワーカースレッドがコンテナ内で実行される作業をコンテナセーフなWebアプリスレッドに送信します。そのスレッドは、ワーカー スレッドが完了するのを待っている間、ハンドル ワーク ループを実行します。

  3. ワーカー リクエストを tomcat サーバーに戻します。これで、Web アプリがクライアント (Web サービス?) として機能します。このようなモデルは、AkhilDev が提案したように、作業を他のサーバーにオフロードするために適切にスケーリングされます。

于 2012-08-13T09:15:20.120 に答える