Spring Batch - 09. StepExecution 와 STEP_EXECUTION 테이블

출처

목차

StepExecution

Step 에 대한 한번의 시도를 의미하는 객체로서 Step 실행 중에 발생한 정보들을 저장하고 있는 객체
BATCH_STEP_EXECUTION 테이블과 매핑된다.

StepExecution 객체는 Step 이 매번 시도될 때마다 각 Step 별로 생성되며 JobRepository 를 통해 저장됩니다. 이를 통해 실행 중인 Step의 정보를 추적하고, 필요한 경우 실행을 재개하거나 롤백할 수 있습니다.

Job 이 재시작 하더라도 이미 성공적으로 완료된 Step 은 재 실행되지 않고 실패한 Step 만 실행됩니다. 이전 단계 Step 이 실패해서 현재 Step 을 실행하지 않는다면 StepExecetoin 객체를 생성하지 않는다.

StepExecution 인터페이스

public interface StepExecution {

public long getStepExecutionId();

public String getStepName();

public BatchStatus getBatchStatus();

public Date getStartTime();

public Date getEndTime();

public String getExitStatus();

public Serializable getPersistentUserData();

public Metric[] getMetrics();
}

JobExecution 과의 관계

  • Step 의 StepExecution 이 모두 정상적으로 완료 되어야 JobExecution 이 정상적으로 완료된다.
  • Step 의 StepExecution 중 하나라도 실패하면 JobExecution 은 실패한다.

Job & Step 이해하기

  • Job 과 JobParamter 를 이용해 JobInstance 를 생성 후 실행시 JobExecution 을 생성한다.
  • JobExecution 이 실행되면 각 Step 별로 StepExecution 이 생성된다.
    • 같은 Job 내 StepExecution 의 Job 정보는 동일하다.
    • 각 Step 별로 관리되는 값은 서로 상이하다.
  • StepExecution 이 모두 COMPLETED 로 완료된 결우 JobExecution 상태도 COMPLETED 로 완료된다.
  • StepExecution 이 하나라도 FAILED 로 끝날 경우 JobExecution 상태는 FAILED 상태가 된다.

@RequiredArgsConstructor
@Configuration
public class StepExecutionConfiguration {

private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;

@Bean
public Job BatchJob() {
return this.jobBuilderFactory.get("Job")
.start(step1())
.next(step2())
.build();
}

@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("step1 has executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet((contribution, chunkContext) -> {
System.out.println("step2 has executed");
return RepeatStatus.FINISHED;
})
.build();
}

/* @Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(executionContextTasklet1)
.build();
}
@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet(executionContextTasklet2)
.build();
}
@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.tasklet(executionContextTasklet3)
.build();
}*/
}
Share