Spring boot async method
aync method
비동기 실행
- 회사 프로젝트중 비동기 실행을 처리해야하는 부분이 있어서 조사하던중. spring에서 지원하는
@aync
기능이 있는 것을 알고 조사하여 개발했다. - 이전까지는
Threadable
클래스를 정의하고, thread들을 관리하는monitoring thread
를 같이 선언하여 했으나 결과에 상관없이 작업을 비동기로 실행하는 로직이 있으면 됐기 때문에 해당기능을 조사하여 개발하였다. - thread를 나눠서 실행하고, 실행한 모든 thread가 완료될 때까지 기다리는 로직은 다른 방법으로 구현하였다.
Example
Application
package kr.co.lguplus.nw.cert.mgmt.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@EnableAsync // @async method를 사용하기 위한 선언
@SpringBootApplication
public class Application {
/** ACS/IDS 로그검색에서 사용하는 빈 네임 */
public static final String ACS_IDS_THREAD_POOL_TASK_EXECUTOR_NAME = "kr.co.lguplus.nw.cert.mgmt.api.Application#getAcsIdsThreadPoolTaskExecutor()";
public static final String ACS_IDS_THREAD_NAME = "ACS/IDS 로그검색";
// queue가 full 됬을 때의 최대 pool의 개수
private static final int MAX_POOL_SIZE = 128;
// queue에 데이터가 없을 때의 최대 pool의 개수
private static final int CORE_POOL_SIZE = 64;
// queue의 개수
private static final int QUEUE_CAPACITY = 64;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
/**
* ACS/IDS 로그검색에서 비동기 처리를 하기 위해 생성하는 BEAN
* 비동기 호출하는 @async 메소드의 pool을 관리하기 위한 설정 값
*
* @return
*/
@Bean(name = ACS_IDS_THREAD_POOL_TASK_EXECUTOR_NAME)
public ThreadPoolTaskExecutor getAcsIdsThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
// thread의 이름 설정
executor.setThreadFactory(new DefaultThreadFactory(ACS_IDS_THREAD_NAME));
// thread의 group 설정
executor.setThreadGroupName("async");
// pool size 설정
executor.setCorePoolSize(CORE_POOL_SIZE);
executor.setMaxPoolSize(MAX_POOL_SIZE);
executor.setQueueCapacity(QUEUE_CAPACITY);
return executor;
}
}
async method
package kr.co.lguplus.nw.cert.mgmt.api.service.impl;
...
import org.springframework.scheduling.annotation.Async;
...
/**
* @see AcsIdsLogSearchService
*
* @author mjyoun
* @since 2020. 01. 20.
*
*/
@Service(AcsIdsLogSearchServiceImpl.BEAN_NAME)
public class AcsIdsLogSearchServiceImpl implements AcsIdsLogSearchService {
...
/**
* @throws IOException
* @see {@link kr.co.lguplus.nw.cert.mgmt.api.service.AcsIdsLogSearchService#executeLogSearch(Long)}
*/
@Override
@Async(Application.ACS_IDS_THREAD_POOL_TASK_EXECUTOR_NAME) // application에 선언한 thread pool을 사용함
public void executeLogSearch(Long seq) throws IOException {
...
}
...
}
마지막으로…
- spring boot에서는 위처럼 쉽게 비동기 메소드를 정의하고 실행할 수 있다.
- 주의 사항으로
@async
메소드에서@async
메소드 호출은 불가하다.