MIREC:
私は仕事をしません。このような実装を持っています。ご覧のとおり、仕事は〜5秒かかりますし、上で実行する必要がありますfixedRate
1秒。手段は〜ん、並列に実行されている5jobsませんが、春待ちを開始する前に別のものを仕事を終えるために...私は同じとパラメータを使って2つ目の@Scheduledジョブのスケジュール2」を追加した場合、私は並列に実行されている2つの異なる仕事を持っているが、そこでなければならないこと同じジョブ。これを達成することが何とか可能ですか?
@Scheduled(fixedRate = 1000)
private void schedule1() {
int index = atomicInteger1.addAndGet(1);
logger.info("Run Schedule1 nr.{} started at: {}", index, LocalDateTime.now());
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
} finally {
logger.info("Schedule1 nr.{} finished at: {}", index, LocalDateTime.now());
}
}
@Bean(destroyMethod = "shutdown")
public Executor taskExecutor() {
return Executors.newScheduledThreadPool(10);
}
Maroun:
各スケジュールされたタスクがします決してこのような場合には、並列に実行していません。タスクがかかるためです長く与えられたよりもfixedRate
。どうして?そのためScheduledExecutorService#scheduleAtFixedRate
(太字は私です)と呼ばれ、ドキュメントが言うようにされています。
...このタスクのいずれかの実行はその期間よりも長くかかる場合、その後の実行が遅れて開始することができますが、同時に実行されません。
これを解決する一つの方法は、使用している@Async
と@EnableAsync
。多くの例がで利用可能な春のドキュメント:
@EnableAsync
public class Example {
@Async
@Scheduled(fixedRate = 1000)
public void schedule1() throws InterruptedException {
Thread.sleep(5000);
}
}