programing

봄에 일정이 겹치지 않게 하는 방법은?

lastmoon 2023. 9. 9. 10:03
반응형

봄에 일정이 겹치지 않게 하는 방법은?

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

이전 루틴이 아직 완료되지 않은 경우 이 스프링 작업이 실행되지 않도록 하려면 어떻게 해야 합니까?

기본적으로 spring은 단일 스레드 Executor를 사용합니다.따라서 두 @Scheduled 작업이 중복되지 않습니다.전혀 관련이 없는 클래스의 @Scheduled 메서드 두 개라도 모든 @Scheduled 작업을 실행할 수 있는 스레드가 하나밖에 없기 때문에 중복되지 않습니다.

또한 기본 Executor를 스레드 풀 기반의 Executor로 교체하더라도 해당 Executors는 일반적으로 이전에 예약된 인스턴스가 완료될 때까지 태스크 인스턴스의 실행을 지연시킵니다.고정된 지연, 고정된 경우에 해당됩니다.인터벌, 크론 기반 스케줄.예를 들어, 이 스프링 구성을 사용하면 예약을 생성합니다.스레드 풀을 사용하지만 원하는 대로 동일한 일정의 동시 인스턴스를 허용하지 않는 스레드 풀 실행기:

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

이것은 예정된 자바독입니다.ThreadPoolExecutor::scheduleAtFixedRate: 다음을 지정합니다.

이 작업의 실행이 해당 기간보다 오래 걸릴 경우 후속 실행이 늦게 시작될 수 있지만 동시에 실행되지는 않습니다.

참고: 이 기능은 @Async 작업에는 적용되지 않습니다. spring은 필요한 만큼의 동시 인스턴스를 생성합니다(풀에 충분한 스레드가 있는 경우).

와 함께fixedDelay, 기간은 업무 종료 후에 측정하므로 걱정하지 마십시오.

언급URL : https://stackoverflow.com/questions/24033208/how-to-prevent-overlapping-schedules-in-spring

반응형