mail 알림을 구현하면서 응답 지연 이슈가 있었다.
사용자에게 알림 메일을 발송해야 했는데 메일 발송이 끝날 때 까지 클라이언트가 응답을 받지 못해 처리가 늦어지는 문제가 발생했다.
스프링이 아주 다 해줘서 구현하는 데 어려움은 별로 없었다!
Thread pool의 수를 고민했지만 메일이 많이 쌓일 것 같지 않고 바로 메일이 전송될 필요도 없어서 queue size만 크게 잡고 thread pool의 수는 정말 최소한만 뒀다.
AsyncConfig.java
@Configuration // 설정
@EnableAsync // spring 메소드 비동기 기능 활성화
public class AsyncConfig extends AsyncConfigurerSupport{
@Override
public Executor getAsyncExecutor(){
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
//기본적으로 실행 대기하는 thread의 갯수 설정
executor.setCorePoolSize(2);
//동시동작하는 최대 Thread pool 크기
executor.setMaxPoolSize(10);
//thread pool que 크기
executor.setQueueCapacity(500);
// spring이 생성하는 thread의 접두사 설정
executor.setThreadNamePrefix("mail-async-");
//initialize 안해주면 executor 사용 불가
executor.initialize();
return executor;
}
}
MailService.java
@Async
public void assessmentMailBuilder(MailDtomailDto) throws MessagingException{
//서비스 로직
}
AsyncConfigurer를 구현할 때 상속 받는 class
getAsyncExecutor()
setCorePoolSize
setMaxPoolSize
setQueueCapacity
@Async