ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring boot 비동기 처리 (Aysnc)
    Computer Science/Spring boot 2022. 9. 29. 14:24

    비동기 처리의 thread 수 등을 설정 할 config 파일을 만들어준다.

     

    package com.server.pandascore.config;
    
    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
    
    import java.util.concurrent.Executor;
    
    @Configuration
    @EnableAsync
    public class AsyncConfig extends AsyncConfigurerSupport {
    
        @Override
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(2);
            executor.setMaxPoolSize(10);
            executor.setQueueCapacity(500);
            executor.setThreadNamePrefix("async");
            executor.initialize();
            return executor;
        }
    }

    초기 core수와 max 설정, 작업이 대기 할 수 있는 queue 사이즈를 설정할 수 있다.
    다만 작업의 개수의 따라 유동적으로 thread가 2~10으로 변동되는 방식이 아니다. 2개의 코어로 돌리다가 queue가 다 차게 되면 그 때서야 thread의 수를 max size 만큼 올리는 방식으로 동작하게 된다.

     

    이렇게 설정을 하고 나면 이게 사용할 함수에 @Async 만 붙이면 되는 데 주의 할 점이 3가지 있다.

    Async 가 안되는 경우가 3가지가 있는데

     

    1. 메소드가 public 이 아니면 Async가 동작하지 않는다.

    2. Return type가 void가 아니라면 반환을 해야하기에 당연히도 aynsc 가 동작하지 않는다.

    3. 동일 객체 내부에서 호출하면 async가 동작하지 않는다.

     

     

    ex)

    @Async
    public void getAllMatchList(){
        List<Long> leagueIdList = pandaScoreSave.getAllLeagueIdList();
        leagueIdList.forEach(leagueId -> {
            getMatchListByLeagueId(leagueId);
        });
    }

    이 함수는 이제 비동기 처리가 가능한 함수이다.

Designed by Tistory.