スプリング-非同期2(実施)


メール通知の実施中に遅延応答の問題が発生しました.
ユーザーに注意メールを送るべきだったが、メールの送信が終了するまでクライアントが応答を受信できず、処理が遅延した.
スプリングがよくできていて、実現するのは難しくありません!

Thread poolの数を考慮しましたが、メールがあまり積まれず、すぐにメールを送信する必要もないので、キューサイズを調整するだけで、スレッド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{
	//서비스 로직
}
AsyncConfigurerSupport
AsyncConfigurer実施時に引き継いだclassgetAsyncExecutor()
  • Executorメソッドを呼び出して非同期処理を行う場合、このメソッドを上書きしてスレッドプールなどの
  • をリセットすることができる.
    ThreadPoolTaskExecutor setCorePoolSize
  • ThreadPoolExecutorのコアプールサイズ設定
  • デフォルト管理するThread数字
  • setMaxPoolSize
  • カーネルプールとキューがいっぱいになると、生成される最大Thread数
  • のデフォルト値はIntegerです.MAX_VALUE
  • setQueueCapacity
  • 個のコアプールが満たされた場合(コアプールのサイズを超えるteskに入る)、teskが蓄積できる数は
  • である.@Async
  • 非同期メソッドに
  • を追加
  • 非同期タスクを指定するデモ