IT박스

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

itboxs 2020. 12. 15. 08:27
반응형

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


나는 주석이 달린 몇 가지 방법이 있습니다 @Scheduled(fixedDelay=10000).

애플리케이션 컨텍스트에서 다음과 같은 주석 기반 설정이 있습니다.

<task:annotation-driven />

문제는 때로는 일부 메서드 실행이 몇 초 또는 몇 분 지연된다는 것입니다.

메서드가 실행을 완료하는 데 시간이 걸리더라도 다른 메서드는 계속 실행될 것이라고 가정하고 있습니다. 그래서 나는 지연을 이해하지 못합니다.

지연을 줄이거 나 제거 할 수있는 방법이 있습니까?


일정에 대한 문서는 말합니다 :

풀 크기 속성을 제공하지 않으면 기본 스레드 풀에는 단일 스레드 만 있습니다.

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


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

@Configuration
@EnableScheduling
public class SpringConfiguration {

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

더 많은 제어가 필요한 경우 @Configuration클래스는 SchedulingConfigurer.


로 주석이 달린 메서드 @Scheduled는 한 번에 다른 스레드에서 개별적으로 실행됩니다.

TaskScheduler구성에를 제공하지 않은 경우 Spring은

Executors.newSingleThreadScheduledExecutor();

ScheduledExecutorService단일 스레드에서 실행 되는을 반환합니다 . 따라서 여러 @Scheduled메서드 가있는 경우 예약 된 경우에도 각각 스레드가 이전 작업 실행을 완료 할 때까지 기다려야합니다. 대기열이 비워지는 것보다 더 빨리 채워 지므로 계속 더 크고 더 큰 지연이 발생할 수 있습니다.

적절한 양의 스레드를 사용하여 스케줄링 환경을 구성해야합니다.


당신이 사용할 수있는:

@Bean()
public  ThreadPoolTaskScheduler  taskScheduler(){
    ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
    taskScheduler.setPoolSize(2);
    return  taskScheduler;
}

@EnableScheduling 주석은 키 정보 및 해결 방법을 제공합니다 :

기본적으로는 연관된 스케줄러 정의를 검색합니다. 컨텍스트에서 고유 한 TaskScheduler bean이거나 그렇지 않으면 "taskScheduler"라는 TaskScheduler bean입니다. ScheduledExecutorService 빈에 대해서도 동일한 조회가 수행됩니다. 둘 중 어느 것도 해결할 수없는 경우 로컬 단일 스레드 기본 스케줄러가 생성되어 등록 기관 내에서 사용됩니다 .

더 많은 제어가 필요한 경우 @Configuration 클래스가 SchedulingConfigurer를 구현할 수 있습니다. 이를 통해 기본 ScheduledTaskRegistrar 인스턴스에 액세스 할 수 있습니다. 예를 들어 다음 예제는 예약 된 작업을 실행하는 데 사용되는 Executor를 사용자 지정하는 방법을 보여줍니다.

 @Configuration
 @EnableScheduling
 public class AppConfig implements SchedulingConfigurer {

     @Override
     public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
         taskRegistrar.setScheduler(taskExecutor());
     }

     @Bean(destroyMethod="shutdown")
     public Executor taskExecutor() {
         return Executors.newScheduledThreadPool(100);
     }
 }

(강조 추가됨)


일정 작업에 단일 스레드를 사용하는 기본 스프링. 클래스에 @Configuration을 사용하여 SchedulingConfigurer를 구현할 수 있습니다. 참조 :https://crmepham.github.io/spring-boot-multi-thread-scheduling/

ReferenceURL : https://stackoverflow.com/questions/21993464/does-spring-scheduled-annotated-methods-runs-on-different-threads

반응형