春の重複スケジュールを防ぐ方法?
-
21-12-2019 - |
質問
@Scheduled(fixedDelay = 5000)
public void myJob() {
Thread.sleep(12000);
}
.
前のルーチンがまだ終了していない場合、このSpringジョブの実行を防ぐ方法は?
解決
fixedDelay
では、ジョブの完了後に期間を測定しているため、心配はありません。
他のヒント
デフォルトでは、Springはシングルスレッドエグゼキュータを使用します。だから2つの@scheduledタスクは重複しません。完全に無関係のクラスの2つの@Scheduleされたメソッドでさえも、がすべて@ scheduledタスクを実行するための単一のスレッドのみがあるため、重複しません。
さらに、デフォルトのexecutorをスレッドプールベースの実行系に置き換えても、通常、以前にスケジュールされたインスタンスが完了するまでタスクインスタンスの実行を遅らせます。これは、 fixeddelay、fixedIterval、およびcron ベースのスケジュールに当てはまります。たとえば、このSpring設定は、スレッドプールを使用する scheduledthreadpoolexecutor を作成しますが、あなたが望むのと同じように同じスケジュールの同時インスタンスを許可しません。
@Configuration
@EnableScheduling
...
public class MySpringJavaConfig {
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5);
}
...
}
.
これは Javadoc for ScheduleDthreadPoolExecutor :: scheduleAtfixedRate これは
このタスクの実行がその期間よりも長くかかる場合は、後続の実行が遅くなると同時に実行されません。
注:この機能は、 @ASYNCタスクにも当てはまりません。 Springは必要に応じてそれらの数の同時インスタンスを作成します(プールに十分なスレッドがある場合)
所属していません StackOverflow