SPRING/스프링배치
StepExecution
노트코드
2022. 7. 14. 00:35
- Step에 대한 한번의 시도를 의미하는 객체 Step 실행 중에 발생한 정보들을 저장하고 있는 객체
- 시작시간, 종료시간, 상태, commitCount, rollback count등의 속성을 가짐
- Step이 매번 시도될 때마다 생성되며 각 Step 별로 생성된다.
- Job이 재시작 하더라도 이미 성공적으로 완료된 Step은 재 실행되지 않고 실패한 Step만 실행
- Step이 실제로 시작됐을 때만 StepExecution을 생성함
- Step의 StepExecution이 모두 정상적으로 완료 되어야 JobExecution이 정상적으로 완료된다.
(하나라도 실패시 JobExecution은 실패)
JobExecution와 StepExecution은 1:M관계
* Batch_Step_Execution 테이블

* Batch_JOB_Execution
- Batch_Step_Execution이 모두 성공해야 Batch_Job_Execution이 COMPLETE로 표기됨

JOB 2에서 고의로 에러 발생
@RequiredArgsConstructor
@Configuration
public class BaseJobConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job job() {
return jobBuilderFactory.get("job")
.start(step1())
.next(step2())
.build();
}
@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
throw new RuntimeException("step2 has failed");
// return RepeatStatus.FINISHED;
}
}).build();
}
@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution stepContribution, ChunkContext chunkContext) throws Exception {
return RepeatStatus.FINISHED;
}
}).build();
}
}
STEP2에서 임의로 에러 발생시켰을때 데이터 생성 결과
- JOB_INSTANCE 테이블에 한개가 생김

- BATCH_JOB_INSTANCE 테이블에는 실패 내역이 생김

- BATCH_STEP_EXECUTION 테이블에는 STEP1은 성공 STEP2는 실패로 남김

여기서 바로 다시 STEP2의 에러를 주석처리하고 정상 동작 시키면
- JOB_INSTANCE 테이블은 기존과 동일(데이터가 더 안생겼음)

- BATCH_JOB_INSTANCE 테이블에는 성공 내역이 생김

- BATCH_STEP_EXECUTION 테이블에는 STEP2 성공으로 데이터 생김
(step1은 성공했기 때문에 다시 생기지 않고 실패한 step2만 새로 생긴것을 확인할 수 있음)
