728x90
@EnableAsync
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args);}
}
@Service
public class MessageService {
@Async
public void print(String message) {
System.out.println(message);
}
}
@RequiredArgsConstructor
@RestController
public class MessageController {
private final MessageService messageService;
@GetMapping("/messages")
@ResponseStatus(code = HttpStatus.OK)
public void printMessage() {
for (int i = 1; i <= 100; i++) {
messageService.print(i + "");
}
}
}
스레드를 관리하지 않는다는 문제.@Async
의 기본 설정은 SimpleAsyncTaskExecutor
를 사용하도록 되어있는데, 이것은 스레드 풀이 아니고 단순히 스레드를 만들어내는 역할을 하기 때문
스레드 풀을 사용
@Configuration
@EnableAsync // Application이 아닌, Async 설정 클래스에 붙여야 함.
public class SpringAsyncConfig {
@Bean(name = "threadPoolTaskExecutor")
public Executor threadPoolTaskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(3); // 기본 스레드 수
taskExecutor.setMaxPoolSize(30); // 최대 스레드 수
taskExecutor.setQueueCapacity(100); // Queue 사이즈
taskExecutor.setThreadNamePrefix("Executor-");
return taskExecutor;
}
}
core와 max 사이즈를 설정할 수 있다.
스레드 풀 설정이 완료되었다면, @Async
어노테이션이 붙은 메소드에서 위 빈의 이름을 붙이면 된다.threadPoolTaskExecutor()
같은 빈 생성 메소드를 여러 개 만들고, @Async
설정할 때 원하는 스레드 풀 빈을 넣으면 된다.
리턴 값이 있는 경우
Future, ListenableFuture, CompletableFuture
타입을 리턴 타입으로 사용할 수 있다. 비동기 메소드의 반환 형태를 new AsyncResult()
로 묶으면 된다.
728x90