정산 배치 프로그램의 경우 Application 을 수동으로 구동해야 하며, 동작 완료 시 한번의 실행 이후 작동이 종료가 된다.
스케줄러를 지정하여 반복적으로 특정 시간대에 배치 프로그램을 구동할 수 있도록 하자.
Spring Scheduler
Spring 에서 제공되는 "Scheduled + EnableScheduling" 어노테이션 활용하여 스케줄러 적용
scheduler 가 작동 되면서 백그라운드 실행으로 지속적으로 Application 서버가 작동
Spring Scheduler Thread Pool Issue
@EnableScheduling 에 의해서 스케줄러는 Default 로 ThreadPoolTaskScheduler 를 사용하게 된다. 이때, 별도의 설정을 주어지지 않으면 Thread Pool Size 는 1로 고정이 되어 있으므로, 스케줄러에 배정 된 Thread 는 최대 1개만 사용할 수 밖에 없는 것이다.
Thread Pool Size 를 변경하는 방법에는 2 가지 해결 방안
application.yaml 에 spring.task.scheduling.pool.size 옵션으로 변경이 가능하다.
SchedulingConfigurer 을 통해 설정을 재정의 함으로써 ThreadPoolTaskScheduler size 를 변경 할 수 있다.
Quartz Scheduling
Spring Scheduler 에서 생길 수 있는 이슈에 대해서 간단하고 더 실용적으로 사용할 수 있는 스케줄링 라이브러리 Quartz 도입
Spring Scheduler 문제점
[ 클러스터링 X ] Application Server 가 여러 대가 동작하고 있다면 지금 상태로는 Application Server 마다 동일한 배치가 작동
[ 작업 우선 순위 및 트리거 지정 X ] 정산 데이터 생성 → 정산 배치 프로그램의 흐름으로 진행이 되어야 하기 때문에 배치를 돌리기 위해서는 앞의 작업이 완료가 된 후 배치 작업이 작동 할 수 있도록 순서나 트리거를 지정해야 한다.
Quartz 를 통해서 DB 기반의 클러스터링 활용 [ 옵션 활성화 필수 ]
application-quartz.yml 을 통해서 Quartz 옵션 설정
JobChainingJobListener 를 통해 특정 작업 이후에 동작할 수 있도록 설정
A Job [ API 랜덤 이력 생성 배치 ] 작업 이후 B Job [ 정산 배치 작업 ] 동작 할 수 있도록 Chaining 작업
14
정산 배치 프로그램
스케줄러 적용
개요
Spring Scheduler
Spring 에서 제공되는 "Scheduled + EnableScheduling" 어노테이션 활용하여 스케줄러 적용
Spring Scheduler Thread Pool Issue
ThreadPoolTaskScheduler
를 사용하게 된다.이때, 별도의 설정을 주어지지 않으면 Thread Pool Size 는 1로 고정이 되어 있으므로, 스케줄러에 배정 된 Thread 는 최대 1개만 사용할 수 밖에 없는 것이다.
SchedulingConfigurer
을 통해 설정을 재정의 함으로써ThreadPoolTaskScheduler
size 를 변경 할 수 있다.Quartz Scheduling
Application Server 가 여러 대가 동작하고 있다면 지금 상태로는 Application Server 마다 동일한 배치가 작동
정산 데이터 생성 → 정산 배치 프로그램의 흐름으로 진행이 되어야 하기 때문에 배치를 돌리기 위해서는 앞의 작업이 완료가 된 후 배치 작업이 작동 할 수 있도록 순서나 트리거를 지정해야 한다.
자세한 이야기 : Notion