봄에 겹치는 일정을 방지하는 방법은 무엇입니까?
-
21-12-2019 - |
문제
@Scheduled(fixedDelay = 5000)
public void myJob() {
Thread.sleep(12000);
}
.
이전 루틴이 아직 완료되지 않은 경우이 봄 작업이 실행되지 않도록 어떻게 실행할 수 있습니까?
해결책
fixedDelay
를 사용하면 작업 완료 후 기간이 측정되므로 걱정이 없습니다.
다른 팁
기본적으로 Spring은 단일 스레드 실행 프로그램을 사용합니다. 그래서 두 개의 @scheduled 작업이 겹칠 수 없습니다. 완전히 무관 한 클래스의 @schcheduled 메소드조차도 모든 @scheduled 작업을 실행하는 단일 스레드 만 실행하기 때문에 간단히 겹치지 않습니다.
더 많은 Executor를 스레드 풀 기반 Executor로 바꾸는 경우에도 이전에 예약 된 인스턴스가 완료 될 때까지 해당 실행 프로그램이 태스크 인스턴스의 실행을 지연합니다. 이것은 fixeddelay, fixedinterval 및 cron 기반 일정에 대해서는 사실입니다. 예를 들어,이 스프링 구성은 threadpool을 사용하는 scheduledThreadPoolExecutor 을 생성하지만 원하는대로 동일한 일정의 동시 인스턴스를 허용하지 않습니다.
@Configuration
@EnableScheduling
...
public class MySpringJavaConfig {
@Bean(destroyMethod = "shutdown")
public Executor taskScheduler() {
return Executors.newScheduledThreadPool(5);
}
...
}
.
다음은 scheduledThreadPoolExecutor :: ScheduleAletFixeDrate for schedulatedThreadPoolExecutor :: / P>
이 작업의 실행이 기간보다 오래 걸리면 후속 실행이 늦게 시작될 수 있지만 동시에 실행되지 않습니다.
참고 :이 기능은 @Async 태스크 에 대해 true를 보존하지 않습니다. 봄은 필요에 따라 많은 동시 인스턴스가 생성됩니다 (수영장에 충분한 스레드가있는 경우).