새소식

반응형
Spring/etc

[Spring] @Async 비동기처리

  • -
반응형

출처 : https://velog.io/@yejinh/비동기-파헤치기

요청을 하고 순차적으로 결과를 기다리지 않고 다음 할 일을 진행

추후에 작업 결과를 확인하고 싶은 경우 Future 등을 이용하여 확인 가능하다.

 

스프링에서 비동기 처리를 지원하는 애노테이션 

 

@EnableAsync @SpringBootApplication public class MySpringApplication { ... } public class AsyncService { @Async public void method(){ ... } }

 

위와 같이 사용하면 @Async가 붙은 메서드는 별도의 스레드에서 동작한다.

다만, 기본적으로 비동기 처리를 할 때 ( org.springframework.core.task.SimpleAsyncTaskExecutor ) executor를 통해서 이루어지는데 고려해야 할 사항이 존재한다.

  • 요청이 이루어질 때마다 새로운 thread를 생성
    • thread pool을 이용하여 재사용을 하는 구조가 아님
    • 요청이 많은 API의 경우에는 자원 고갈 문제가 발생 할 수 있음 

 

thread pool을 지정해서 사용하고 싶은 경우에는 @Async 애너테이션 프로퍼티로 threadPoolTaskExecutor를 작성하면 된다. 

@EnableAsync @SpringBootApplication public class MySpringApplication { @Bean(name = "threadPoolTaskExecutor") public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(2); executor.setMaxPoolSize(10); executor.setQueueCapacity(50); return executor; } } public class AsyncService { @Async("threadPoolTaskExecutor") public void method(){ ... } }

 

@Async 애노테이션은 Spring의 AOP 방식인 proxy를 통해 동작이 이루어진다.

Proxy 방식인 경우 주의해야 할 사항을 주의해야 한다.

https://kkang-joo.tistory.com/58

  • self invocation 
  • private method 

@Async에서 발생한 예외는 호출자에게 전파되지 않는다.

@Async에서 발생한 예외를 Custom 하게 처리하기 위해서는 별도의 AsyncUncaughtExceptionHandler가 필요 

@EnableAsync @SpringBootApplication public class MySpringApplication extends AsyncConfigurerSupport { @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return new TestAsyncUncaughtExceptionHandler(); } } public class TestAsyncUncaughtExceptionHandler implements AsyncUncaughtExceptionHandler { @Override public void handleUncaughtException(Throwable throwable, Method method, Object... obj) { ... } }
반응형

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.