JobInstance는 Job의 논리적 실행 단위를 의미한다.Job을 실행하더라도 처리하는 데이터가 다르면 별개의 JobInstance다.
JobInstance다.JobParameters를 통해 JobInstance를 구분한다.JobParameters는 동일한 Job을 서로 다른 JobInstance로 구분하는 핵심 요소다Job + JobParameters = JobInstanceJobExecution은 JobInstance의 실제 실행 시도를 뜻한다.
JobInstance(ex. 4월 정산 배치)라도 여러 번 실행될 수 있다.JobExecution에는 다음 정보들이 포함된다.
COMPLETED,FAILED,STOPPED등)COMPLETED: 배치 작업 완료STARTING: 배치 작업이 실행되기 직전STARTED: 배치 작업이 실행 중STOPPING: 배치 작업이 중지 요청을 받아 중지 진행 중STOPPED: 배치 작업이 요청에 의해 중지된 상태FAILED: 배치 작업이 실행 중 오류로 실패ABANDONED: 배치 작업이 비정상 종료되어 재시작할 수 없는 상태UNKNOWN: 배치 작업의 상태를 확인할 수 없는 불확실한 상태JobInstance는 재실행할 수 없도록 제한한다.
JobParameters로 성공적으로 완료된 Job을 다시 실행하면 예외가 발생한다.Job 실행 시 해당 JobInstance가 과거에 성공적으로 완료된 적이 있는지 검사한다.
JobInstance의 JobExecution 중 BatchStatus가 COMPLETED인 것이 존재하는지 확인COMPLETED 상태의 JobExecution이 존재하면 JobInstanceAlreadyCompleteException을 발생시킨다.COMPLETED 상태의 JobExecution이 없는 경우에는 해당 JobInstance를 다시 실행할 수 있다.
FAILED 상태로 종료된 JobInstance는 재실행 가능하다.spring:
sql:
init:
mode: always
schema-locations: classpath:org/springframework/batch/core/schema-drop-postgresql.sql
Job을 여러 번 실행할 수 있게 하는 특수 컴포넌트JobParameters를 받아 약간 변형된 새로운 JobParameters를 반환한다.
public interface JobParametersIncrementer {
JobParameters getNext(@Nullable JobParameters parameters);
}
RunIdIncrementer
JobParametersIncrementer의 대표적인 구현체run.id라는 이름의 파라미터 값을 증가시키며 파라미터를 변형시킨다.@Bean
public Job brutalizedSystemJob() {
return new JobBuilder("brutalizedSystemJob", jobRepository)
.incrementer(new RunIdIncrementer())
.start(brutalizedSystemStep())
.build();
}
JobParameters는 단순한 데이터 전달체가 아니라 JobInstance를 식별하는 핵심 키로 작동하지만 모든 파라미터가 식별 용도로 사용되는 것은 아니다.identifying 속성이 해당 파라미터가 JobInstance 식별에 사용되는지 여부를 결정한다.{'chaos':'{value=true, type=class java.lang.Boolean, identifying=true}',
'run.id':'{value=2, type=class java.lang.Long, identifying=true}'}
기본적으로 모든 JobParameter는 identifying=true로 설정된다.
JobInstance로 취급해야 할 경우verbose=truechunk.size=1000output.path=/tmp/batch/report./gradlew bootRun --args='--spring.batch.job.name=brutalizedSystemJob chaos=true,java.lang.Boolean verbose=true,java.lang.String,false'
verbose=true,java.lang.String,false에서 마지막 false가 identifying 속성이다.
주의사항
identifying=false로 설정하면 같은 JobInstance로 인식되어 재실행이 불가능해진다.identifying=true로 유지하면 불필요하게 중복 실행이 가능해진다.Job은 기본적으로 실패한 경우 재시작이 가능하다.preventRestart()
JobBuilder의 메서드로, 설정된 Job이 재시작 불가능하도록 만든다.Job이 실패한 후 다시 실행하려고 하면 JobRestartException을 발생시킨다.@Bean
public Job brutalizedSystemJob() {
return new JobBuilder("brutalizedSystemJob", jobRepository)
.start(brutalizedSystemStep())
.preventRestart()
.build();
}
preventRestart() 설정이 적용된 Job은 어떤 이유로든 실패하면 같은 파라미터로는 다시 실행할 수 없다.RunIdIncrementer와 함께 사용 시 preventRestart() 설정이 의미가 없어진다.
RunIdIncrementer는 매번 다른 run.id 값을 생성하여 새로운 JobInstance를 만든다.