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();
명령어는 이,를 합니다.ScheduledExecutorService
1번으로 하다와 같이, 「」, 「」가 복수 는,@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
'programing' 카테고리의 다른 글
테이블에서 JSON 값 추출 (0) | 2022.11.30 |
---|---|
여러 어레이 요소를 설정 해제하는 더 좋은 방법 (0) | 2022.11.30 |
에 초점을 맞출 수 있을까요?에 초점을 맞출 수 있을까요?JavaScript focus() 함수를 사용하고 있습니까? (0) | 2022.10.31 |
Chrome DevTools의 요소에서 발생한 이벤트를 보려면 어떻게 해야 합니까? (0) | 2022.10.31 |
쿼리 빌더가 원시 SQL 쿼리를 문자열로 출력하려면 어떻게 해야 합니까? (0) | 2022.10.31 |