문제

@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를 보존하지 않습니다. 봄은 필요에 따라 많은 동시 인스턴스가 생성됩니다 (수영장에 충분한 스레드가있는 경우).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top