spring boot에서 @Async를 사용하는 방법은 간단합니다
1. applicationClass에 @EnableAsync를 선언합니다
@EnableAsync
@SpringBootApplication
public class SpringBootApplication {
...
}
public class AsyncClass {
@Async
public void asyncMethod(String param) {
...
}
}
spring은 기본값으로 SimpleAsyncTaskExecutor를 사용하여 실제 메소드들을 비동기로 실행합니다
설정은 두 가지 레벨로 오버라이드할 수 있습니다
1. 메소드 레벨로 실행자 오버라이드 하기
설정 코드
@Configuration
@EnableAsync // 설정 클래스에 붙이기
public class SpringAsyncConfig {
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
return new ThreadPoolTaskExecutor();
}
}
사용 코드 : 속성 값으로 사용합니다 (bean의 이름값)
@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
System.out.println("Execute method with configured executor - " + Thread.currentThread().getName());
}
@Configuration
@EnableAsync // 설정 클래스에 붙이기
public class SpringAsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
return new ThreadPoolTaskExecutor();
}
}
커스텀 설정이나, 풀을 사용할 때에는 application class에서 @EnableAsync를 제거합니다
런타임 시 @Configuration이 설정된 AsyncConfig 클래스를 읽어들이기 때문입니다
비동기 메소드
@Async
public Future<String> getFuture(String str) throws InterruptedException {
...
return new AsyncResult<>(str);
}
비동기 메소드 사용 코드
Future<String> future = service.getFuture("test");
future.get();
비동기 메소드
@Async
public ListenableFuture<String> getFuture(String str) throws InterruptedException {
...
return new AsyncResult<>(str);
}
비동기 메소드 사용 코드
Listenablefuture<String> future = service.getFuture("test");
future.addCallback(f -> log.info("{}", f));
비동기 메소드
@Async
public CompletableFuture<String> getFuture(String str) throws InterruptedException {
...
return new AsyncResult<>(str).completable();
}
비동기 메소드 사용 코드
CompletableFuture<String> future = service.getFuture("test");
future.thenAccept(f -> log.info("{}", f));
구현 코드 : AsyncUncaughtExceptionHandler를 상속받습니다
@Configuration
@EnableAsync
public class AsyncExceptionHandler implements AsyncConfigurer {
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return new CustomAsyncExceptionHandler();
}
}
구현 코드 : 리턴 타입인 void인 경우 예회가 호출 스레드로 전파되지 않기 때문에 따로 예외처리를 해주어야합니다
public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler {
@Override
public void handleUncaughtException(Throwable ex, Method method, Object... params) {
...
}
}
읽어주셔서 감사합니다!
참고 사이트
https://spring.io/guides/gs/async-method/