복붙노트

[SPRING] Spring에서 중복되는 스케줄을 방지하는 방법은 무엇입니까?

SPRING

Spring에서 중복되는 스케줄을 방지하는 방법은 무엇입니까?

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

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

해결법

  1. ==============================

    1.fixedDelay를 사용하면 작업 완료 후 기간을 측정하므로 걱정할 필요가 없습니다.

    fixedDelay를 사용하면 작업 완료 후 기간을 측정하므로 걱정할 필요가 없습니다.

  2. ==============================

    2.기본적으로 Spring은 단일 스레드 Executor를 사용합니다. 두 개의 @Scheduled 작업은 중복되지 않습니다. 전혀 관계가없는 클래스의 두 개의 @Scheduled 메소드도 @Scheduled 작업을 모두 실행하는 단일 스레드 만 있기 때문에 단순히 겹치지 않습니다.

    기본적으로 Spring은 단일 스레드 Executor를 사용합니다. 두 개의 @Scheduled 작업은 중복되지 않습니다. 전혀 관계가없는 클래스의 두 개의 @Scheduled 메소드도 @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은 필요한만큼 동시 인스턴스를 생성합니다 (풀에 충분한 스레드가있는 경우).

  3. from https://stackoverflow.com/questions/24033208/how-to-prevent-overlapping-schedules-in-spring by cc-by-sa and MIT license