@Async 어노테이션 비동기처리
@Async 어노테이션을 빈Bean에 넣으면 별도의 쓰레드에서 실행.
호출자는 호출된 메소드가 완료될 때 까지 기다릴 필요가 없다.
@Async 의 두가지 제약사항
- public 메소드에만 적용해야한다
- 셀프 호출self invocation – 같은 클래스안에서 async 메소드를 호출 – 은 작동하지않음
메소드가 public이어야 프록시가 될수 있기 때문이고 셀프호출은 프록시를 우회하고 해당 메소드를 직접 호출하기때문에 작동하지않는 것
리턴타입이 없는 메소드 Methods with void Return Type
@Async
public void asyncMethodWithVoidReturnType() {
System.out.println("Execute method asynchronously. " + Thread.currentThread().getName());
}
리턴타입이 있는 메소드 Methods with Return Type
@Async
public Future<String> asyncMethodWithReturnType() {
System.out.println("Execute method asynchronously - " + Thread.currentThread().getName());
try {
Thread.sleep(5000);
return new AsyncResult<String>("hello world !!!!");
} catch (InterruptedException e) {
//
}
return null;
}
위의 메소드를 호출하여 Future 객체를 사용해 비동기 처리의 결과값을 가져오면
public void testAsyncAnnotationForMethodsWithReturnType()
throws InterruptedException, ExecutionException {
System.out.println("Invoking an asynchronous method. "
+ Thread.currentThread().getName());
Future<String> future = asyncAnnotationExample.asyncMethodWithReturnType();
while (true) {
if (future.isDone()) {
System.out.println("Result from asynchronous process - " + future.get());
break;
}
System.out.println("Continue doing something else. ");
Thread.sleep(1000);
}
}
실행자 The Executor
스프링은 기본값으로 SimpleAsyncTaskExecutor 를 사용하여 실제 메소드들을 비동기 실행한다. 기본 설정은 두가지 레벨로 오버라이드할 수 있다 - 어플리케이션 레벨 또는 개인 메소드 레벨.
메소드 레벨로 실행자 오버라이드하기 Override the Executor at the Method Level
@Configuration
@EnableAsync
public class SpringAsyncConfig {
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
return new ThreadPoolTaskExecutor();
}
}
그 후 실행자 이름을 @Async에서 속성값으로 제공
@Async("threadPoolTaskExecutor")
public void asyncMethodWithConfiguredExecutor() {
System.out.println("Execute method with configured executor - " + Thread.currentThread().getName());
}
어플리케이션 레벨로 실행자 오버라이드하기 Override the Executor at the Application Level
이 경우 설정 클래스는AsyncConfigurer 인터페이스를 구현해주어야한다 - 이는 getAsyncExecutor() 메소드를 구현해야한다는 의미이다. 여기에 우리는 전체 어플리케이션을 위한 실행자를 리턴할 것이다 - 이는 이제 @Async로 어노테이션된 메소드를 실행하는 기본 실행자가 된다.
@Configuration
@EnableAsync
public class SpringAsyncConfig implements AsyncConfigurer {
@Override
public Executor getAsyncExecutor() {
return new ThreadPoolTaskExecutor();
}
}
참고블로그
'Java > Spring' 카테고리의 다른 글
[Spring] 이메일 인증번호를 통한 회원가입 (1) | 2023.01.11 |
---|---|
JPA study 2주차 영속성 컨텍스트 (0) | 2022.12.17 |
[Spring]@Validation @valid 어노테이션 (1) | 2022.12.08 |
[Java/Spring] 스프링 컨테이너 (0) | 2022.12.08 |
[Spring] 스프링 프레임워크(Spring Framework) (0) | 2022.12.04 |
댓글