質問

@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は必要に応じてそれらの数の同時インスタンスを作成します(プールに十分なスレッドがある場合)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top