인프런 커뮤니티 질문&답변

화이팅님의 프로필 이미지
화이팅

작성한 질문수

스프링 배치

사용자 정의 ExitStatus를 listener에서 정의 하는 이유

작성

·

365

·

수정됨

0

사용자 정의 ExitStatusStepExecutionListener.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을 결정하는 역할을 수행합니다.

이상입니다. 추가적인 질문이 있으시면 언제든지 댓글로 남겨주세요. 감사합니다.

화이팅님의 프로필 이미지
화이팅

작성한 질문수

질문하기