반응형
@Bean("HyeonTaskExecutor")
public TaskExecutor taskExecutor() {
ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
taskExecutor.setCorePoolSize(5); // 기본 스레드 수
taskExecutor.setMaxPoolSize(10); // 최대 스레드 수
return taskExecutor;
}
core와 max 사이즈를 설정할 수 있습니다. 여기서 주의할 점이 있습니다. 최초 core 사이즈만큼 동작하다가 더 이상 처리할 수 없을 경우 max 사이즈만큼 스레드가 증가할 것이라고 예상할 수 있지만 사실 그렇지 않다.
.
내부적으로는 Integer.MAX_VALUE 사이즈의 LinkedBlockingQueue를 생성해서 core 사이즈만큼의 스레드에서 task를 처리할 수 없을 경우 queue에서 대기하게 됩니다. queue가 꽉 차게 되면 그때 max 사이즈만큼 스레드를 생성해서 처리하게 됩니다.
Capacity
core 사이즈 보다 많은 요청이 발생할 경우 Integer.MAX_VALUE 사이즈만큼의 queue를 이용한다고 했는데 이게 너무 크다고 생각된다면 queueCapacity 사이즈를 변경할 수 있습니다.
- AbortPolicy
- 기본 설정
- RejectedExecutionException을 발생시킴
- DiscardOldestPolicy
- 오래된 작업을 skip 합니다.
- 모든 task가 무조건 처리되어야 할 필요가 없을 경우 사용합니다.
- DiscardPolicy
- 처리하려는 작업을 skip 합니다.
- 역시 모든 task가 무조건 처리되어야 할 필요가 없을 경우 사용합니다.
- CallerRunsPolicy
- • shutdown 상태가 아니라면 ThreadPoolTaskExecutor에 요청한 thread에서 직접 처리합니다.
@Bean("simpleTaskExecutor") public TaskExecutor taskExecutor() { ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); taskExecutor.setCorePoolSize(5); // 기본 스레드 수 taskExecutor.setMaxPoolSize(10); // 최대 스레드 수 taskExecutor.setQueueCapacity(100); // Queue 사이즈 taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); return taskExecutor; }
taskExecutor.setWaitForTasksToCompleteOnShutdown(true);
= queue에 남아 있는 모든 작업이 완료될 때까지 기다리게 됩니다. - 예외와 누락 없이 최대한 처리하려면
CallerRunsPolicy
로 설정하는 것이 좋을 것 같다. - Timeout*
shutdown 최대 60초 대기
- 만약 모든 작업이 처리되길 기다리기 힘든 경우라면 최대 종료 대기 시간을 설정할 수 있다.
- • shutdown 상태가 아니라면 ThreadPoolTaskExecutor에 요청한 thread에서 직접 처리합니다.
반응형
'개발 > Spring Boot' 카테고리의 다른 글
[Spring Boot] ssl 인증서 적용 및 발급(Let's Encrypt ) (0) | 2023.10.11 |
---|---|
[Spring Boot] war 패키징 방법 (0) | 2023.10.10 |
[Spring Boot] spring-integration-ip 이용한 Tcp 통신 (0) | 2023.10.10 |
[SpringBoot] HikariPool stats logging (0) | 2022.03.31 |
DAO, DTO, VO란 (0) | 2022.03.29 |