반응형
필자는 Spring Batch 를 이용하여 배치 프로그램을 만드는 업무를 시작하였다.
아래와 같은 동작을 하는 간단한 배치프로그램이었다.
- Reader 로 데이터읽기
- Processor 로 데이터 처리하기
- Writer 로 데이터 적재하기
굉장히 쉬울줄만 알았던 업무였으나 예상하지 못한 곳에서 막히고 말았다.
Job 을 끝내야 하는데 어떤기준으로 끝나는지 알지 못했다.
그래서 Spring Batch 를 간단하게나마 분석하다가 알게된 내용을 공유하고자 이 글을 쓴다.
Chunk 기반의 Job 은 별다른 설정을 하지 않는다면 SimpleChunkProvider 에 의해 동작하게 된다.
SimpleChunkProvider.provider -> SimpleChunkProvider.read() -> SimpleChunkProvider.doRead() 의 순서대로 진행을 하게 된다.
필자가 궁금했던 Job 을 끝내는 기준은 SimpleChunkProvider.provider 에서 알 수 있었다.
아래는 SimpleChunkProvider 의 provider 메소드의 내용이다.
public Chunk<I> provide(final StepContribution contribution) throws Exception {
final Chunk<I> inputs = new Chunk<>();
repeatOperations.iterate(new RepeatCallback() {
@Override
public RepeatStatus doInIteration(final RepeatContext context) throws Exception {
I item = null;
Timer.Sample sample = Timer.start(Metrics.globalRegistry);
String status = BatchMetrics.STATUS_SUCCESS;
try {
item = read(contribution, inputs);
}
catch (SkipOverflowException e) {
// read() tells us about an excess of skips by throwing an
// exception
status = BatchMetrics.STATUS_FAILURE;
return RepeatStatus.FINISHED;
}
finally {
stopTimer(sample, contribution.getStepExecution(), status);
}
if (item == null) {
inputs.setEnd();
return RepeatStatus.FINISHED;
}
inputs.add(item);
contribution.incrementReadCount();
return RepeatStatus.CONTINUABLE;
}
});
return inputs;
}
내용을 보다보면 아래와 같은 코드가 있다.
if (item == null) {
inputs.setEnd();
return RepeatStatus.FINISHED;
}
이 코드에서 reader 의 결과가 null 일때 Job 을 끝내는 것을 알 수 있다.
반응형
'개발 > Spring' 카테고리의 다른 글
nested objectId serialize, deserialize 했을 때 값이 달라지는 이슈 해결하기 (0) | 2022.04.23 |
---|---|
MongoDB 여러개의 Document 한번에 insert 하기 (0) | 2021.08.22 |
[Spring] Kotlin 을 이용하여 MongoDB Query를 Type-safe 하게 작성하기 (0) | 2021.07.30 |
[Spring] Interceptor postHandle이 동작을 안해요. (1) | 2021.07.02 |
[ReactiveCrudRepository] 데이터 삭제가 안되는 이슈 (0) | 2021.05.07 |
댓글