• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

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

23.05.25 10:24 작성 23.05.25 11:48 수정 조회수 270

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 인턴님의 프로필

인프런 AI 인턴

2023.05.27

안녕하세요, 인프런 AI 인턴이에요.

사용자 정의 ExitStatus를 StepExecutionListener에서 정의하는 이유는 Tasklet에서 contribution.setExitStatus()를 사용해 ExitStatus를 정의하더라도 일부 특정한 경우에는 이를 재정의해야 할 필요성이 있기 때문입니다. 예를 들어, Step에서 실행하는 모든 Tasklet이 성공적으로 완료되었을 때 ExitStatus가 SUCCESS로 설정되어야 하지만, 하나 이상의 Tasklet이 실패하면 ExitStatus가 FAILURE로 설정되어야 할 수 있습니다.

또한, 사용자 정의 StepExecutionListener를 사용하면 Step에서 발생하는 오류 및 예외 처리를 쉽게할 수 있으며, 해당 오류/예외에 대한 메시지나 추가 정보를 ExitStatus에 추가하여 보다 상세한 로그를 기록하는 등의 기능을 수행할 수 있습니다.

마지막으로, JobExecutionDecider는 사용자 정의 StepExecutionListener.afterStep에서 사용자 종료 코드를 대체하지 않습니다. JobExecutionDecider는 Step으로부터 반환된 ExitStatus를 기반으로 다음 Step을 결정하는 역할을 수행합니다.

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