4

毎分約 1000 ジョブを実行するクォーツ ベースのスケジューラ アプリケーションがあり、毎分毎秒、つまり毎秒約 16 ~ 17 ジョブに均等に分散されます。理想的には、これらの 16 ~ 17 個のジョブが同時に起動する必要がありますが、ジョブの execute メソッドの最初のステートメント (単に実行時間を記録するだけ) が非常に遅く呼び出されています。たとえば、05:00 から 05:04 まで 1 分あたり 1000 個のジョブがスケジュールされていると仮定します。したがって、理想的には、05:03:50 にスケジュールされたジョブは、execute メソッドの最初のステートメントを 05:03:50 にログに記録する必要がありますが、約 05:06:38 に実行しています。スケジュールされたジョブの所要時間は約 15 ~ 20 ミリ秒でした。ActiveMQ キューでメッセージを送信するだけなので、このスケジュールされたジョブは十分に高速です。クォーツのスレッドの数を 100 に指定し、さらに 200 以上に増やしてみましたが、利益は得られませんでした。もう 1 つ気づいたことは、スケジューラからのログが最初の 1 分後に順次送信されることです。

[Quartz_Worker_28] <Some log statement>
..
..
[Quartz_Worker_29] <Some log statement>
..
..
[Quartz_Worker_30] <Some log statement>
..
..

したがって、しばらくするとクォーツがほぼ連続してスレッドを実行していることを示唆しています。これは、ジョブの完了を永続ストア (この場合は別の postgres データベース) に通知するのにかかる時間や、コンテキストの切り替えが原因で発生している可能性があります。

この奇妙な動作の背後にある理由は何ですか?

編集:より詳細なログ

[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] org.quartz.plugins.history.LoggingTriggerHistoryPlugin - Trigger [<trigger_name>] fired job [<job_name>] scheduled at:  06-07-2012 10:08:33.458, next scheduled at:  06-07-2012 10:34:53.000
[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob - execute begin--------- ScheduledLocateJob with key: <job_name> started at Fri Jul 06 10:08:37 EDT 2012
[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob <some log statement>
[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob <some log statement>
[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob <some log statement>
[06/07/12 10:08:37:220][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob - execute end--------- ScheduledLocateJob with key: <job_name> ended at Fri Jul 06 10:08:37 EDT 2012
[06/07/12 10:08:37:220][QuartzScheduler_Worker-34][INFO] org.quartz.plugins.history.LoggingTriggerHistoryPlugin - Trigger [<trigger_name>] completed firing job [<job_name>] with resulting trigger instruction code: DO NOTHING. Next scheduled at:  06-07-2012 10:34:53.000

上記のログのこのセクションを疑っています

scheduled at:  06-07-2012 10:08:33.458, next scheduled at:  06-07-2012 10:34:53.000

このジョブは 10:04:53 にスケジュールされていましたが、10:08:33 に起動し、それでも Quartz はそれを失火と見なしませんでした。誤爆じゃないの?

4

1 に答える 1

3

以下で遊んでみてください。動作が改善されるはずです

org.quartz.scheduler.batchTriggerAcquisitionMaxCount
org.quartz.jobStore.acquireTriggersWithinLock
org.quartz.scheduler.idleWaitTime
于 2012-07-08T03:46:40.043 に答える