Translate

[Spring Boot] 여러개의 @Scheduled 메소드중 하나만 수행이 되는 경우




증상

스프링부트를 이용하여 애플리케이션 개발중
@Scheduled 애노테이션을 이용하여 몇개의 스케쥴을 등록했는데,
1004lucifer
겹치는 시간이 발생 시 동시에 2~3개가 실행되는게 아니라
기존 돌고있던 스케쥴이 끝나고 다른 스케쥴이 돌아버리거나 시간이 너무 경과한 경우 돌지 않는 스케쥴도 발생했었다.




원인

기본적으로 스케쥴러가 사용할 수 있는 Thread 갯수가 1개밖에 없어서 여러개의 스케쥴을 등록해도 기존에 돌고있던게 끝나지 않으면 다른 스케쥴이 동작하지 않았다.




해결방법

XML 설정파일에 pool size 를 설정하는 방법도 있지만
스프링부트를 사용하면서 가급적 XML 파일 없이 셋팅 하는걸 선호하기에 다른방법을 찾아봤다.
1004lucifer
application.properties 나 application.yml 파일에 셋팅하는게 없을까 싶었는데 찾지 못하고 JAVA 파일로 설정하는 방법밖에 찾을 수가 없었다.
(아래의 파일을 추가해서 Pool Size 설정해서 이슈 해결)


@Configuration
public class SchedulingConfigurerConfiguration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(100);
        taskScheduler.initialize();
        taskRegistrar.setTaskScheduler(taskScheduler);
    }
}


참고: https://stackoverflow.com/questions/29796651/what-is-the-default-scheduler-pool-size-in-spring-boot

댓글