inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 배치

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

460

화이팅

작성한 질문수 37

0

사용자 정의 ExitStatusStepExecutionListener.afterStep에서 정의하는 이유가 궁금합니다.

Tasklet 안에서 조건에 따라 contribution.setExitStatus(new ExitStatus("PASS"));를 사용해도 되는게 아닌가 싶은데, 그냥 afterStep에서도 할 수 있다는걸 보여준걸까요?

 

또, 다음 강의인 JobExecutionDecider 는 사용자 정의 StepExecutionListener.afterStep에서 사용자 종료 코드를 정의하는 것을 대체한다고 생각하면 되는걸까요?

spring-boot spring-batch

답변 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 인턴이에요.

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

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

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

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

스프링 배치 버전 질문

0

122

1

소스코드가 어디에 있나요?

0

96

2

트랜잭션 예외

0

92

1

질문이 있습니다.

0

130

2

ChunkListener 에서 beforeChunk 의 실행 시점 관련 질문

0

125

2

여러 JOB 설정하는법

0

150

2

강의 자료 다른 방법 있을까요?

0

154

1

JobExecution과 JobExecutionContext와의 관계

0

186

2

특정 job만 실행

1

252

1

Batch 성능 질문

0

153

1

ItemReaderAdapter 종료

0

80

1

[ 강좌 Git 브랜치 문의 ] 섹션 9 > JdbcCursorItemReader, JpaCursorItemReader

0

179

2

Spring Batch 배포 질문

0

246

2

spring batch 버전

0

236

2

retry count 관련 질문

0

172

2

StepExecutionListener 의 afterStep 에서 return ExitStatus.FAILED 에 의한 동작에 의문이 갑니다.

0

330

2

jdbc, jpa 커서방식 조회 방식 차이 질문 (강사님께 답변 받고 싶습니다)

0

235

2

Multithread step과 AsyncItemProcessor

0

203

2

job 재실행

0

251

2

bean 생명주기 문제 도와주세요(@Scope("step"), @Autowired)

0

183

1

Multi-threaded-step과 Partitioning 차이 확인

0

175

2

jdbcCursorReader, jdbcPagingReader 질문

0

146

1

step muti-thread 질문

0

111

1

itemSteam open update close 질문

0

112

1