1

Java プログラムで Quartz Cron トリガーを使用しています。私が使用した Cron 式は 0 0 * * * ?

ここで、スケジューラーを 1 時間に 1 回実行したいと考えました。同じことをテストするためにjbossサーバーを起動し、その後、ウィンドウの時間を5:59:45などにリセットし、6:00:00にスケジューラーが起動しませんでした。

次に、最初に時刻を 5:55:00 に調整してから、サーバーを起動すると、スケジューラが 6:00:00 に起動しました。

サーバーまたはスケジューラは、最初はシステムのタイミングで初期化され、内部で時間を維持しますか??

4

4 に答える 4

6

Quartz CronTriggerのソースコードによると、トリガーは次に起動する必要がある日付を保持します。

サーバーを6:15:00に起動した場合、Quartzは次の起動時間として7:00:00を保持すると思います。サーバー時間を5:55:45に変更しても、次の起動時間は更新されず、7:00:00が次の起動時間として保持されます。したがって、イベントは6:00:00に発生するのではなく、7:00:00に発生します。

したがって、時間は直接保持されませんが、起動時間は保持され、システムクロックを変更しても更新されないように見えます。

于 2010-09-02T14:14:38.297 に答える
1

JDBCジョブストアを使用する場合、クォーツは1分間隔でデータベースをチェックし、現在のシステム時刻を使用して、現在実行するジョブを探します。

システム時刻を進めると、クォーツは次のチェックで適切なジョブを実行します(つまり、1分以内)。

于 2011-02-03T13:51:23.523 に答える
1

私も同じ問題に直面し、この問題の解決策は次のとおりです。

式は 0 0 * * * ? つまり、秒、分、時間、日、月、曜日です。そのため、毎日、毎月、毎週、そしてその年が何であれ、毎正時に発砲します。

この式は単に、時間の開始時に毎時ジョブを起動することを示しているため、サーバーが起動する前の時間が記録されるため、サーバーの起動前に時間が経過した場合、次の時間に起動します。 -

1. 5:55 にサーバーを起動しましたが、サーバーの起動に 7 分かかったため、時間が 6:00 より 2 分多く経過しているため、次の起動時間は 7:00 になります。

2. ただし、サーバーが 5:59:59 に正常に起動した場合、スケジューラは毎時開始時に実行され、サーバーは 6:00 クロックの前に準備が整うため、サーバーは確実に 6:00 に起動します。

注:サーバーの起動後にWindowsで時間を変更しても、サーバーの実行時間までに時間が記録されるため、スケジューラーは実行されません。

于 2012-09-04T13:09:42.347 に答える