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

  1. 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만 새로 생긴것을 확인할 수 있음)