ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Batch에서 Job Completed 이후 종료되지 않을때
    Spring/Spring 2023. 9. 9. 19:14

    Spring Batch를 사용하여 배치 작업을 처리할 때 Job이 Completed 된 후 어플리케이션이 종료되지 않는다면, TaskExecutor 를 사용하고 있지 않은지 확인해보자. batch 에서 병렬 처리를 통해 성능을 최적화하는 것은 매우 중요하다. 이를 위해 TaskExecutor를 사용하여 병렬 작업을 수행할 수 있다. 하지만 병렬 작업이 완료된 후 애플리케이션이 정상적으로 종료되지 않는 문제를 겪을 수 있다. TaskExecutor 를 설정했다면 Job이 완료된이후 shutdown 시켜주어야 한다.

    TaskExecutor 설정

    Spring Batch에서 병렬 작업을 위해 TaskExecutor를 설정하는데 ThreadPoolTaskExecutor를 사용하여 적절한 설정을 하는 방법은 다음과 같다:

     

     

     

    위 설정에서 setWaitForTasksToCompleteOnShutdown(true)와 setAwaitTerminationSeconds(30)를 설정하여 애플리케이션 종료 시 현재 실행 중인 작업이 완료될 때까지 최대 30초 동안 기다리도록 한다.

    JobExecutionListener를 통한 TaskExecutor 종료

    Job이 완료된 후 TaskExecutor를 종료하는 방법은 JobExecutionListener를 사용하는 것이다. 아래 예시에서는 Job 완료 후 TaskExecutor를 종료하는 로직을 구현한다:

     

     

    이렇게 설정하면, Job이 완료된 후 TaskExecutor가 정상적으로 종료되어 애플리케이션이 올바르게 종료될 수 있다.

     

     

    shutdown() vs initiateShutdown()

    shutdown()

    shutdown() 메서드는 ExecutorService에서 제공되는 표준 메서드로, 새로운 작업을 수락하지 않고 현재 실행 중인 작업이 완료될 때까지 기다린다. ThreadPoolTaskExecutor에서 이 메서드를 호출하면 다음과 같은 동작을 한다:

    • 새로운 작업을 더 이상 수락하지 않는다.
    • 현재 실행 중인 작업은 완료될 때까지 계속 실행된다.

    initiateShutdown()

    Spring의 ThreadPoolTaskExecutor는 ExecutorService의 shutdown() 메서드 외에도 initiateShutdown() 메서드를 제공한다. 이 메서드는 기본적으로 shutdown() 메서드를 호출하지만, 추가적인 논리를 포함할 수 있다. 이 메서드는 커스터마이징된 종료 로직을 포함할 수 있는 가능성을 제공한다.

     

    어느 메서드를 사용해야 할까?

    일반적으로 shutdown() 메서드를 사용하는 것이 표준이며, 대부분의 경우에 적합하다. 하지만 추가적인 종료 로직이 필요한 경우 initiateShutdown() 메서드를 오버라이드하여 커스터마이징할 수 있다. Spring의 기본 ThreadPoolTaskExecutor 구현에서는 initiateShutdown()이 shutdown()을 호출하므로, 특별한 이유가 없다면 shutdown()을 사용하는 것이 좋다.

Designed by Tistory.