복붙노트

[SPRING] Spring @Scheduled 주석이 달린 메서드는 다른 스레드에서 실행됩니까?

SPRING

Spring @Scheduled 주석이 달린 메서드는 다른 스레드에서 실행됩니까?

@Scheduled (fixedDelay = 10000) 주석이 달린 여러 메소드가 있습니다.

애플리케이션 컨텍스트에서이 주석 설정을 사용합니다.

<task:annotation-driven />

문제는 때로는 메소드 실행의 일부가 몇 초 또는 몇 분 늦어지는 경우입니다.

비록 메소드가 실행을 끝내는데 시간이 걸린다 고해도, 다른 메소드는 여전히 실행될 것이라고 가정합니다. 그래서 나는 그 지연을 이해하지 못합니다.

어쩌면 지연을 줄이거 나 없앨 수 있습니까?

해결법

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

    1.예약에 관한 문서는 다음과 같습니다 :

    예약에 관한 문서는 다음과 같습니다 :

    따라서 예약 된 작업이 많은 경우 설명서에 설명 된대로 스케줄러를 구성하여 더 많은 스레드가있는 풀을 만들어 긴 작업 하나가 다른 모든 작업을 지연시키지 않도록해야합니다.

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

    2.완전성을 위해 아래 코드는 java config를 사용하여 스케줄러를 구성하는 가장 간단한 방법을 보여줍니다.

    완전성을 위해 아래 코드는 java config를 사용하여 스케줄러를 구성하는 가장 간단한 방법을 보여줍니다.

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

    더 많은 제어가 필요하면 @Configuration 클래스가 SchedulingConfigurer를 구현할 수 있습니다.

  3. ==============================

    3.@Scheduled 주석이 달린 메소드는 다른 스레드에서 동시에 실행되도록되어 있습니다.

    @Scheduled 주석이 달린 메소드는 다른 스레드에서 동시에 실행되도록되어 있습니다.

    구성에 TaskScheduler를 제공하지 않으면 Spring은 다음을 사용합니다.

    Executors.newSingleThreadScheduledExecutor();
    

    단일 스레드에서 실행되는 ScheduledExecutorService를 반환합니다. 따라서 @Scheduled 메서드가 여러 개있는 경우에는 예약되었지만 스레드가 이전 작업 실행을 완료 할 때까지 기다려야합니다. 대기열이 비워지는 것보다 빠르게 채워지는만큼 계속 커질 수 있습니다.

    적절한 양의 스레드로 스케줄링 환경을 구성했는지 확인하십시오.

  4. ==============================

    4.당신이 사용할 수있는:

    당신이 사용할 수있는:

    @Bean()
    public  ThreadPoolTaskScheduler  taskScheduler(){
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(2);
        return  taskScheduler;
    }
    
  5. from https://stackoverflow.com/questions/21993464/does-spring-scheduled-annotated-methods-runs-on-different-threads by cc-by-sa and MIT license