티스토리 뷰
Spring Batch 테스트 코드를 짜다가 메인 애플리케이션은 잘 작동하는데,
테스트 코드를 실행하면 해당 job은 실행이 되지만 첫 step이 진행이 안되는 현상이였다.
job meta table인 BATCH_JOB_EXECUTION 에서 해당 job 정보를 보면 STATUS가 STARTED, EXIT_CODE는 UNKNOWN 이였다.
해당 현상을 검색해보니 아래와 같은 스택오버플로우 글을 보았다.
How to update Spring Batch status on unexpected shutdown
I'm implementing a service that would reject job requests from being processed if an existing job is running. Unfortunately, I'm not sure if there is a way to tell the difference between a job tha...
stackoverflow.com
대충 요약해보면 갑작스럽게 작업이 종료되는 경우에 DB에 해당 job 상태를 쓰지 못한다는 거 같은데...
혹시나해서 JobLauncher에 TaskExecutor를 확인해보니 SimpleAsyncTaskExecutor를 사용하고 있었다...
그래서 아래와 같이 job을 실행한 뒤에 while문을 추가해주니 job이 정상적으로 작동했다.
@Test
void jobTest() throws Exception {
//..생략
JobExecution jobExecution = jobLauncherTestUtils.launchJob(builder.toJobParameters());
Thread.sleep(2000);
while(jobExecution.isRunnig()) {
}
assertEquals(jobExecution.getExitStatus(), ExitStatus.COMPLETED);
}
테스트 코드에서 job 실행은 잘 되지만, step 진행이 안되고 끝나버린다면 사용하고 있는 TaskExecutor을 확인해보자...
추가) https://dongdev.tistory.com/89
JobLauncher (Sync, Async)
JobLauncher Batch Job을 실행시킨다. Job과 JobParameters를 인자로 받는다. Batch를 수행한 후 JobExecution을 반환한다. Spring Batch가 구동되면 JobLauncher 빈이 생성된다. Job 실행 jobLauncher.run(job, jobParameters) Sync ta
dongdev.tistory.com