본문 바로가기

개발/Spring Boot

[Spring Boot] ThreadPoolTaskExecutor 예제

반응형
@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초 대기
    • 만약 모든 작업이 처리되길 기다리기 힘든 경우라면 최대 종료 대기 시간을 설정할 수 있다.
반응형