13

私は Quartz を初めて使用し、ジョブのライフサイクルについて疑問を持っています。

いくつかのことを行うように構成された単一のジョブがあるとします。

ジョブが起動し、その作業を終了します。再び起動したとき、それは同じインスタンスであるか (おそらくスケジューラによってスリープおよび起動に設定されている)、または新しいジョブ インスタンスであるか (ジョブが終了すると強制終了され、トリガー条件が再び満たされると新しいジョブ インスタンスが作成されます) ?

このような質問をするのは、アプリケーション (クォーツをサポートする Spring 3 mvc) をデバッグするときに、ジョブの新しいインスタンスと、ジョブが起動されるたびに SimpleThreadPool$WorkerThreadRun() が開かれた新しいスレッドが表示されるため、SimpleThreadPool$WorkerThreadRun()スレッドが積み上げられ、終了することはありません。

この動作が問題ないのか、それともメモリがいっぱいになるのか知りたいだけです;-)

誰か説明してもらえますか?前もって感謝します。

4

2 に答える 2

15

Quartz は、そのジョブをトリガーするたびに、ジョブ クラスの新しいインスタンスを作成します。非常にまれにトリガーされるようにスケジュールされた数十万のジョブがあるとします。これらすべてのジョブをメモリに保持するのはメモリの無駄です。

ただし、Quartz の Spring サポート、特にを使用している場合MethodInvokingJobDetailFactoryBean、Spring はジョブのライフサイクルを処理します (基本的に、Bean の 1 つの指定されたメソッドを呼び出します)。しかし、あなたのアプリケーションには当てはまらないようです。

もちろん、ジョブが完了し、他の参照がそれを指していない場合 (これは通常のケースです)、ガベージ コレクターは最終的にジョブが占有していたメモリを解放します)。

最後にスレッドについて - Quartz はワーカースレッドの固定プールを作成します (org.quartz.threadPool.threadCount構成オプションを参照)。ジョブを実行するたびに、Quartz は異なるスレッドを使用することを決定する場合がありますが、トリガーごとに新しいスレッドを作成するわけではありません。

于 2012-05-05T15:31:55.627 に答える
3

バージョン 2.1.5 (最新バージョン) について書きますが、他のバージョンについても同様です。

Job -「newJob」関数を使用して「JobFactory」のインスタンスによって作成されたインスタンス ( SimpleJobFactoryなど)。JobRunShellクラスの「initialize」メソッドで実行される「newJob」の呼び出し。JobRunShell -「 QuartzSchedulerThread .run 」のローカル変数に保持され、他のリストやフィールドには格納されないオブジェクト。

そのため、トリガー時間ごとに作成された新しいJobインスタンスが実行され、ガベージ コレクターによって正常にクリーンアップされます。

于 2012-05-05T16:08:36.113 に答える