programing

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

minecode 2022. 10. 31. 21:31
반응형

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

.@Scheduled(fixedDelay=10000).

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

<task:annotation-driven />

문제는 일부 메서드의 실행이 몇 초 또는 몇 분씩 지연될 수 있다는 것입니다.

어떤 메서드가 실행을 완료하는 데 시간이 좀 걸리더라도 다른 메서드는 계속 실행될 것입니다.그래서 나는 지연을 이해할 수 없다.

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

완전성을 위해 다음 코드는 스케줄러를 java config로 설정하는 가장 간단한 방법을 나타내고 있습니다.

@Configuration
@EnableScheduling
public class SpringConfiguration {

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

많은한 경우, a는 " " " 입니다.@Configuration class는 class class class class class class class class class class class class를 구현할 수 .SchedulingConfigurer.

스케줄에 관한 문서에는 다음과 같이 기재되어 있습니다.

pool-size 속성을 지정하지 않으면 기본 스레드 풀에는 스레드가 1개만 있습니다.

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

스프링 부트를 사용하는 경우:

응용 프로그램 속성 파일에서 풀 크기를 늘리는 속성도 있습니다.

spring.task.scheduling.pool.size=10

Spring Boot 2.1.0부터 있는 것 같습니다.

""로 을 단 입니다.@Scheduled는 한 번에 다른 스레드로 개별적으로 실행되도록 되어 있습니다.

않은 경우TaskScheduler은 스프링을

Executors.newSingleThreadScheduledExecutor();

명령어는 이,를 합니다.ScheduledExecutorService1번으로 하다와 같이, 「」, 「」가 복수 는,@Scheduled메서드는 스케줄이 되어 있지만 각각 스레드가 이전 태스크의 실행을 완료할 때까지 기다려야 합니다.대기열이 비워지는 것보다 더 빨리 채워지기 때문에 지연이 점점 더 커질 수 있습니다.

적절한 수의 스레드를 사용하여 예약 환경을 구성해야 합니다.

@EnableScheduling 주석에는 주요 정보와 해결 방법이 나와 있습니다.

디폴트로는는 관련된 스케줄러 정의(콘텍스트 내의 일의 TaskScheduler bean 또는 그렇지 않으면 "taskScheduler"라는 이름의 TaskScheduler bean)를 검색합니다.ScheduledExecutorService bean에도 동일한 룩업이 실행됩니다.어느 쪽도 해결할 수 없는 경우 로컬 싱글스레드 디폴트스케줄러가 생성되어 레지스트라 내에서 사용됩니다.

제어가 더 필요한 경우 @Configuration 클래스는 SchedulingConfigr를 구현할 수 있습니다.이를 통해 기반이 되는 ScheduledTaskRegistrar 인스턴스에 액세스할 수 있습니다.예를 들어, 다음 예제에서는 예약된 작업을 실행하는 데 사용되는 실행 프로그램을 사용자 정의하는 방법을 보여 줍니다.

 @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);
     }
 }

(추가)

다음을 사용할 수 있습니다.

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

아래 링크를 참조용으로 사용합니다.자세한 설명과 구현:

https://crmepham.github.io/spring-boot-multi-thread-scheduling/ #:~:text=By%20default%2020Spring%20Boot%20will,%20is%20enough%20threads%20사용가능)

XML 파일 추가를 사용하여 아래 행에 추가합니다.

<task:scheduler id="taskScheduler" pool-size="15" />
<task:scheduled-tasks scheduler="taskScheduler" >
....
</task:scheduled-tasks>

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

자체 스레드 풀 스케줄러를 전달해야 합니다.그렇지 않으면 기본 싱글 스레드 실행기가 사용됩니다.수정하기 위해 아래 코드를 추가했습니다.

@Bean
public Executor scheduledTaskThreadPool() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(10);
    executor.setMaxPoolSize(10);
    executor.setThreadNamePrefix("name-");
    executor.initialize();
    return executor;
}

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

반응형