2012-05-05 7 views
12

私はQuartzには新しく、ジョブのライフサイクルには疑問があります。石英のジョブが発生すると、それは新しいジョブクラスのインスタンスですか?

いくつかのことをするように設定された1つのジョブがあるとしましょう。

ジョブが起動して作業を終了します。再度起動すると、同じインスタンス(スケジューラーによってスリープおよびスリープ解除に設定されている可能性があります)または新しいジョブインスタンスになります(ジョブが終了すると、トリガー条件が再び満たされたときに新しいジョブインスタンスが作成されます) ?

私は私のアプリケーション(クォーツをサポートしたspring 3 mvc)をデバッグするとき、ジョブの新しいインスタンスと、SimpleThreadPool $ WorkerThreadRun()を使った新しいスレッドがジョブが起動されるたびに開くので、SimpleThreadPool $ WorkerThreadRun()スレッドは積み重なり、決して終了しません。私はちょうどこの動作はオールライトであるか、私はメモリに;-)

を埋めるためにバインドされてるかどうかを知りたい

は、誰も私にいくつかの説明を与えることはできますか?前もって感謝します。

答えて

15

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

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

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

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

+0

ありがとうございました。あなたの説明は簡単ではっきりしていて、本当に必要なのです!実際に私のアプリケーションでは、 'JobDetailBean'、' CronTriggerBean'と 'SchedulerFactoryBean'を使っていますが、答えを読むと、私はライフサイクルがスプリングでも処理されていると思います。もう一度Thnks。 – MaVVamaldo

+0

"MethodInvokingJobDetailFactoryBean"についてSpringは** Bean **のライフサイクルを処理し、このBeanのメソッドはQuartz-job(Springの "QuartzJobBean"抽象クラスの子である "org.quartz.Job"インターフェースを実装しています)から呼び出されます。このQuartzジョブインスタンスは、私の答えに記述されているように作成されます。 –

+0

こんにちは@tomasz、JSPからワンボタンをクリックしてdoIt()メソッド(例:Springドキュメント)を呼び出す方法を教えてください。私はQuartzジョブを使用していますが、私のJobクラスのexecute()メソッドは呼び出されていません。私はMethodInvokingJobDetailFactoryBeanをいくつかのトリガーとjobDetailsとSchedulerFactoryBeanと一緒に使用していますが、オンデマンドではない一定の間隔で呼び出されます。ありがとう – Jaikrat

3

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

Job -instanceは、 "newJob"ファンクション(たとえば、SimpleJobFactory)を含む「JobFactory」のインスタンスによって作成されます。 JobRunShell -classの "initialize"メソッドで実行される "newJob"を呼び出します。 JobRunShell -objectはローカル変数 "QuartzSchedulerThread .run"で保持され、他のリストまたはフィールドには格納されません。

したがって、新しいJob -instanceはすべてのトリガー時間ごとに作成され、実行後は通常ガーベジコレクターによってクリーンアップされます。

関連する問題