44
@Scheduled(fixedDelay = 5000)
public void myJob() {
     Thread.sleep(12000);
}

前のルーチンがまだ終了していない場合、この春のジョブが実行されないようにするにはどうすればよいですか?

4

2 に答える 2

91

デフォルトでは、Spring はシングルスレッドの Executor を使用します。したがって、2 つの @Scheduled タスクが重複することはありません。すべての @Scheduled タスクを実行するスレッドが 1 つしかないため、完全に無関係なクラスの 2 つの @Scheduled メソッドでさえ重複しません。

さらに、デフォルトの Executor をスレッド プール ベースの Executor に置き換えたとしても、それらの Executor は通常、以前にスケジュールされたインスタンスが完了するまで、タスク インスタンスの実行を遅らせます。これは、fixedDelay、fixedInterval、および cronベースのスケジュールに当てはまります。たとえば、この春の構成は、スレッドプールを使用するScheduledThreadPoolExecutorを作成しますが、必要に応じて同じスケジュールの同時インスタンスを許可しません。

@Configuration
@EnableScheduling
...
public class MySpringJavaConfig {
    @Bean(destroyMethod = "shutdown")
    public Executor taskScheduler() {
        return Executors.newScheduledThreadPool(5);
    }
    ...
}

これは、次を指定する ScheduledThreadPoolExecutor::scheduleAtFixedRate の javadoc です。

このタスクの実行にその期間よりも時間がかかる場合、後続の実行は遅れて開始される可能性がありますが、同時に実行されることはありません。

注: この機能は@Async タスクには当てはまりません。spring は、必要な数の同時インスタンスを作成します (プールに十分なスレッドがある場合)。

于 2015-05-19T13:42:21.047 に答える
46

ではfixedDelay、作業完了後に期間を計測しますのでご安心ください。

于 2014-06-04T09:12:28.007 に答える