작성
·
365
·
수정됨
0
사용자 정의 ExitStatus
를 StepExecutionListener.afterStep
에서 정의하는 이유가 궁금합니다.
Tasklet
안에서 조건에 따라 contribution.setExitStatus(new ExitStatus("PASS"));
를 사용해도 되는게 아닌가 싶은데, 그냥 afterStep
에서도 할 수 있다는걸 보여준걸까요?
또, 다음 강의인 JobExecutionDecider
는 사용자 정의 StepExecutionListener.afterStep
에서 사용자 종료 코드를 정의하는 것을 대체한다고 생각하면 되는걸까요?
답변 2
1
네 맞습니다
ExitStatus 를 설정하는 방법이 리스너를 사용하는 방법과 contribution 을 사용하는 방법 두가지가 있는 것이죠
리스너는 Job, Step, Chunk 등 각 객체의 실행 전후로 호출되는 클래스인데 TaskletStep 의 실행이 종료되는 시점에 StepExecutionListener 의 afterStep 이 호출되면서 ExitStatus 를 최종 반영하는 단계를 거치게 됩니다.
이 때 afterStep 의 반환값을 사용자 정의한 ExitStatus 값을 전달하면 해당 상태가 적용이 됩니다.
아래는 TaskletStep 의 부모인 AbstractStep 에서 실행되는 소스입니다.
@Nullable
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
for (Iterator<StepExecutionListener> iterator = list.reverse(); iterator.hasNext();) {
StepExecutionListener listener = iterator.next();
ExitStatus close = listener.afterStep(stepExecution);
stepExecution.setExitStatus(stepExecution.getExitStatus().and(close));
}
return stepExecution.getExitStatus();
}
위에 보시면
ExitStatus close = listener.afterStep(stepExecution); 가 있는데
이 부분이 StepExecutionListener 의 afterStep 을 호출하고 사용자 정의한 값을 반환 받는 부분입니다.
그리고
stepExecution.setExitStatus(stepExecution.getExitStatus().and(close));
에서 최종 반영하게 됩니다.
0
안녕하세요, 인프런 AI 인턴이에요.
사용자 정의 ExitStatus를 StepExecutionListener에서 정의하는 이유는 Tasklet에서 contribution.setExitStatus()를 사용해 ExitStatus를 정의하더라도 일부 특정한 경우에는 이를 재정의해야 할 필요성이 있기 때문입니다. 예를 들어, Step에서 실행하는 모든 Tasklet이 성공적으로 완료되었을 때 ExitStatus가 SUCCESS로 설정되어야 하지만, 하나 이상의 Tasklet이 실패하면 ExitStatus가 FAILURE로 설정되어야 할 수 있습니다.
또한, 사용자 정의 StepExecutionListener를 사용하면 Step에서 발생하는 오류 및 예외 처리를 쉽게할 수 있으며, 해당 오류/예외에 대한 메시지나 추가 정보를 ExitStatus에 추가하여 보다 상세한 로그를 기록하는 등의 기능을 수행할 수 있습니다.
마지막으로, JobExecutionDecider는 사용자 정의 StepExecutionListener.afterStep에서 사용자 종료 코드를 대체하지 않습니다. JobExecutionDecider는 Step으로부터 반환된 ExitStatus를 기반으로 다음 Step을 결정하는 역할을 수행합니다.
이상입니다. 추가적인 질문이 있으시면 언제든지 댓글로 남겨주세요. 감사합니다.