반응형
StepContribution
StepContribution은 Chunk 기반 Tasklet에서 Chunk 프로세스의 변경 사항을 버퍼링 한 후 StepExecution 상태를 업데이트하는 도메인 객체다.
- Chunck 커밋 직전에 StepExecution의 apply 메서드를 호출하여 상태를 업데이트한다.
- ExitStatus의 기본 종료코드 외 사용자 정의 종료코드를 생성해서 StepExecution에 적용할 수 있다.
StepContribution의 구조
- readCount : 성공적으로 read한 아이템 수
- writeCount : 성공적으로 write한 아이템 수
- filterCount : ItemProcessor에 의해 필터링된 아이템 수
- parentSkipCount : 부모 클래스인 StepExecution의 총 skip 수
- readSkipCount : read에 실패하여 스킵된 횟수
- writeSkipCount : write에 실패하여 스킵된 횟수
- processSkipCount : process에 실패하여 스킵된 횟수
- ExitStatus : 실행결과를 나타내는 클래스로 종료코드를 포함(UNKNOWN, EXECUTING, COMPLETED, NOOP, FAILED, STOPPED)
- stepExecution : StepExecution 객체
StepContribution 클래스
public class StepContribution implements Serializable {
private volatile int readCount = 0;
private volatile int writeCount = 0;
private volatile int filterCount = 0;
private final int parentSkipCount;
private volatile int readSkipCount;
private volatile int writeSkipCount;
private volatile int processSkipCount;
private ExitStatus exitStatus = ExitStatus.EXECUTING;
private volatile StepExecution stepExecution;
...
}
StepContribution 실행 흐름
- 먼저 TaskletStep이 시작되면 StepExecution 객체를 생성한다.(각 Step마다 생성)
- StepExecution이 내부적으로 StepContribution을 생성한다.
- 이후 TaskletStep의 기본 구현체인 ChunkOrientedTasklet을 호출한다.
- Chunk 기반의 프로세스는 ItemReader, ItemProcessor, ItemWriter를 다룬다.
- ItemReader는 item을 읽고, 스킵한 내용을 기록한 후 ItemProcessor에 넘긴다.
- ItemProcessor는 ItemReader로부터 전달받은 내용을 가공, 필터링 등의 처리하고 ItemWriter에 넘긴다. (filterCount, processSkipCount 등을 기록한다.)
- ItemWriter는 ItemProcessor로부터 전달받은 item에 대해 쓰기 작업을 수행한다.(writeCount, writeSkipCount 등을 기록한다.)
- 각 ItemReader, ItemProcessor, ItemWriter의 기록한 내용을 수행한 시점마다 StepContribution에 저장된다.
- StepContribution은 최종적으로 ItemReader, ItemProcessor, ItemWriter로부터 전달받은 내용과 ExitStatus 등의 값을 StepExecution에 업데이트한다.
StepExecution의 apply 메서드
public synchronized void apply(StepContribution contribution) {
readSkipCount += contribution.getReadSkipCount();
writeSkipCount += contribution.getWriteSkipCount();
processSkipCount += contribution.getProcessSkipCount();
filterCount += contribution.getFilterCount();
readCount += contribution.getReadCount();
writeCount += contribution.getWriteCount();
exitStatus = exitStatus.and(contribution.getExitStatus());
}
Chunk 기반의 Tasklet을 작성하지 않으면 ItemReader, ItemProcessor, ItemWriter 등의 저장 정보는 실행되지 않아 Count 정보가 모두 0인 상태로 저장될 것이다.
반응형
'프레임워크(Framework) > Spring' 카테고리의 다른 글
[Spring] 스프링 부트 3.2 RestClient 살펴보기 (0) | 2024.05.30 |
---|---|
[Spring Batch] 스프링 배치 StepExecution 이해하기 - Spring boot 2.x (0) | 2023.07.04 |
[Spring Batch] 스프링 배치 Tasklet의 여러 가지 구현 방식 - Spring boot 2.x (0) | 2023.07.02 |
[Spring Batch] 스프링 배치 Step 이해하기 - Spring boot 2.x (0) | 2023.07.01 |
[Spring Batch] 스프링 배치 JobInstance 이해하기 - Spring boot 2.x (0) | 2023.06.25 |