2017-10-20 79 views
1

@Scheduledアノテーションを使用するさまざまなスケジューラを持つSpringブートアプリケーションがあります。スケジュールの一部はfixedRateを使用して設定され、他の設定はcronが使用されます。 fixedRateのスケジュールはうまくいきますが、私は先月、cronの予定の実際の時間が毎日1〜2時間変化することに気付きました。即ちSpringスケジュールされたCronジョブが間違った時刻に起動する

@Scheduled(cron = "0 0 2 * * *") 

のクーロン・セットアップとジョブ

3:00 AMの代わりに、午前2時に発生します。毎日起きているわけでもありません。それは数日連続して同じ時間に実行され、その後何かが起き、アプリケーションを再起動するまで実行されるたびに別の時間が経過します。

サーバのシステム時間は正確ですが、ここではすべてのアイディアがありません。誰かがこれまでに遭遇したことはありますか?

EDIT 1

私は仕事が同じ間隔で、ミス発射し、結果がランダムに見えるかどうかを判断するために、いくつかのログに入れて。ここでは、前述のcronジョブの開始/終了時間は3日間です:

Format: Calendar.getInstance().getTime() (System.currentTimeMillis()) 

Start: Sat Oct 21 03:14:15 CDT 2017 (1508573655778) 
End: Sat Oct 21 03:22:24 CDT 2017 (1508574144708) 

Start: Sun Oct 22 02:26:58 CDT 2017 (1508657218774) 
End: Sun Oct 22 02:35:12 CDT 2017 (1508657712492) 

Start: Mon Oct 23 02:00:03 CDT 2017 (1508742003072) 
End: Mon Oct 23 02:08:11 CDT 2017 (1508742491493) 

答えて

0

最後に考え出しました。私はThreadPoolTask​​Schedulerセットアップを持っていなかったので、スケジュールされたすべてのジョブを実行するのに十分な大きさのスレッドプールを用意していませんでした。

@Configuration 
public class TaskSchedulerConfig { 

    @Bean 
    public ThreadPoolTaskScheduler threadPoolTaskScheduler() { 
     ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); 
     threadPoolTaskScheduler.setPoolSize(30); 
     return threadPoolTaskScheduler; 
    } 

} 
2

は、各オフ時間に正確に1時間を発火している、またはあなたが述べたように、変数のですか? ロギングを使用して、どのように起動するのかを測定していますか?そして、あなたが注釈をつけているメソッドは、どれくらい時間がかかるのですか?メソッドの先頭と最後にメッセージを記録し、それらのタイムスタンプを比較します。試してみてください

private static final String CRON_SCHEDULE = "0 0 2 * * ?"; 
private static final String USER_TIMEZONE = "America/New_York"; 
// ... 
@Scheduled(cron = CRON_SCHEDULE, zone = USER_TIMEZONE) 
/* your method here */ 

タイムゾーンを指定すると結果が異なるかどうかを確認することができます。

+0

Hey Blake。私は先週金曜日にいくつかのログを追加し、週末にいくつかの結果を収集するようにしました。私はそれらの結果を私の元の質問に掲載しました。 –

+0

開始時刻が予定どおりに行われていれば、予定通りに発射されていないようです。その他の注釈は何ですか? Springコンポーネント、コントローラ、またはサービスクラスのスケジュールされたメソッドですか? – Blake

+1

最後に分かりました。私はThreadPoolTask​​Schedulerセットアップを持っていなかったので、スケジュールされたすべてのジョブをサポートするのに十分なプールサイズはありませんでした。 1つは起動し、もう1つはブロックされるか、内部待ち行列に入れられますが、最終的に起動すると、キューに入れられた/ブロックされていた時間がずっとずれています。 –

関連する問題