Spring Batch - 05. JobInstance 와 JOB_INSTANCE 테이블

출처

목차

JobInstance 생성 및 실행

JobInstance란 Job에 JobParameters가 전달되어 만들어지는 실행가능한 논리적 작업 단위 객체이다.

JobInstance 는 JobLauncher 가 샐행될 때 생성된다.

  • JobLauncher 가 실행될 때는 새로운 JobInstance 생성 하거나 기존에 생성된 JobInstance 를 반환한다.
    • 처음 시작하는 Job, JobParameter 일 경우 새로운 JobInstance 가 생성된다.
    • 이전과 동일한 Job, JobParameter 로 실행 할 경우 이미 존재하는 JobInstance 를 반환한다.
    • 내부적으로 JobNameJobKey 를 갖고 JobInstance 객체를 얻는다.
  • JobJobInstance 와의 관계는 1:N 관계를 갖는다.

BATCH_JOB_INSTANCE 테이블과 매핑

JOB_NAME(Job)JOB_KEY(JobParamter 해시값) 이 동일한 데이터는 중복해서 저장할 수 없다.

  • JobRepository 는 Job 실행중에 발생하는 메타 데이터를 DB 에 저장하는 역할을 거친다.
    • Job 을 실행할 때 넘겨진 JobJobParameter 값을 갖고 DB 에 확인하는 역할을 한다.
    • Job 이 처음 실행하는 Job 인지 확인한다.
    • 처음 실행하는 Job 이면 새로운 JobInstance 를 반환한다.
    • 존재하는 값이면 기존 JobInstance 를 반환한다.
      • 더 이상 Job 이 실행되지 않고 JobInstanceAlreadyCompleteException 예외를 반환한다.

@RequiredArgsConstructor
@Configuration
public class JobInstanceConfiguration {

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 {
JobInstance jobInstance = contribution.getStepExecution().getJobExecution().getJobInstance();
System.out.println("jobInstance.getId() : " + jobInstance.getId());
System.out.println("jobInstance.getInstanceId() : " + jobInstance.getInstanceId());
System.out.println("jobInstance.getJobName() : " + jobInstance.getJobName());
System.out.println("jobInstance.getJobVersion : " + jobInstance.getVersion());
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();
}
}

ApplicationRunner 를 구현한 JobRunner 를 이용해 Job 을 실행시키도록 한다.

  • Job 과 JobParameter 객체를 생성해 JobLauncher 를 실행하도록 한다.
@Component
public class JobRunner implements ApplicationRunner {

@Autowired
private JobLauncher jobLauncher;

@Autowired
private Job job;

@Override
public void run(ApplicationArguments args) throws Exception {

JobParameters jobParameters = new JobParametersBuilder()
.addString("name", "user1")
// .addDate("reqDate", new Date())
.toJobParameters();

jobLauncher.run(job,jobParameters);
}
}

spring.batch.job.enabled 를 false 로 설정함으로써 Spring boot 에서 자동으로 실행시키지 않도록 한다.

Share