강의메모 #
스프링 배치 도메인 이해 - JobInstance #
기본 개념 #
- Job 이 실행될 때 생성되는 Job의 논리적 실행 단위 객체
- 고유하게 식별 가능한 작업 실행을 나타냄
- Job 의 설정과 구성은 동일하지만 Job 이 실행되는 시점에 처리하는 내용은 다르기 때문에 Job 의 실행을 구분해야 함
- ex) 하루에 한 번 씩 배치 Job이 실행된다면 매일 실행되는 각각의 Job 을 JobInstance 로 표현
- JobInstance 생성 및 실행
- 처음 시작하는 Job + JobParameter 일 경우 새로운 JobInstance 생성
- 이전과 동일한 Job + JobParameter 으로 실행 할 경우 이미 존재하는 JobInstance 리턴
- 내부적으로 JobName + jobKey (jobParametes 의 해시값) 를 가지고 JobInstance 객체를 얻음
- Job 과는 1:M 관계
BATCH_JOB_INSTANCE 테이블과 매핑 #
JOB_NAME (Job) 과 JOB_KEY (JobParameter 해시값) 가 동일한 데이터는 중복해서 저장할 수 없음
BATCH_JOB_INSTANCE 테이블 #
잡을 식별하는 고유 정보가 포함된 잡 파라미터로 잡을 처음 실행하면 단일 JobInstance 레코드가 테이블에 등록된다.
필드 | 설명 |
---|---|
JOB_EXECUTION_ID | 테이블의 기본 키 |
VERSION | oplimistic locking 에 사용되는 레코드 버전 |
JOB_NAME | 실행된 잡의 이름 |
JOB_KEY | 잡 이름과 잡 파라미터의 해시 값으로, JobInstance 를 고유하게 식별하는 데 사용되는 값 |
예제 수행 #
@Configuration
@RequiredArgsConstructor
public class JobInstanceConfiguration {
// job 생성
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job jobInstanceTestJob() {
return this.jobBuilderFactory.get("jobInstanceTestJob")
/* step start */
.start(jobInstanceTestStep1())
.next(jobInstanceTestStep2())
.build();
}
@Bean
public Step jobInstanceTestStep1() {
return stepBuilderFactory.get("jobInstanceTestStep1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
/**
* Tasklet 은 무한반복되어 FINISHED 를 리턴하여 종료
*/
System.out.println("jobInstanceTestStep1 was executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step jobInstanceTestStep2() {
return stepBuilderFactory.get("jobInstanceTestStep2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("jobInstanceTestStep2 was executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
}
- BATCH_JOB_INSTANCE 테이블 조회
JobInstance 객체 생성 과정 #