Open 0JUUU opened 2 years ago
많이 사용하는 설정들을 알아보자
spring:
batch:
job:
names: batchJob1 # 이렇게 하드코딩해서 실행시키고자 하는 Job을 설정할 수 있음
하지만 이렇게 하드코딩을 하는 경우는 많이 없음 (배치Job의 종류대로 선택해서 수행해야하는 경우가 많기 때문에)
바인딩할 수 있는 내용을 적음 (외부에서 Job의 이름을 실행 시점에 Arguments로 전달해서 job.name
에 바인딩되도록 함)
spring:
batch:
job:
names: ${job.name:NONE} # 전달받은 인자 내용이 job.name에 매핑되고, 전달받은 인자가 없다면 NONE이라는 Job이 수행됨
--
(하이픈 2개) 가 붙어야함!
여기서 설정한 Job의 name 값이 BatchProperties
에 저장이 됨.
여러 개를 선택하고 싶다면 ,
로 구분
spring:
batch:
jdbc:
table-prefix: SYSTEM_ # default : BATCH_
// 다른 Job 하나 더 생성
@RequiredArgsConstructor
@Configuration
public class JobConfiguration2 {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job batchJob2() {
return this.jobBuilderFactory.get("batchJob2")
.incrementer(new RunIdIncrementer())
.start(step3())
.next(step4())
.build();
}
@Bean
public Step step3() {
return this.stepBuilderFactory.get("step3")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println(">> step3 has executed");
return RepeatStatus.FINISHED;
}
})
.build();
}
@Bean
public Step step4() {
return this.stepBuilderFactory.get("step4")
.tasklet(((contribution, chunkContext) -> {
System.out.println(">> step4 has executed");
return RepeatStatus.FINISHED;
}))
.build();
}
}
JobBuilder
를 생성하는 팩토리 클래스 ➡️ get(String name)
메서드 제공jobBuilderFactory.get("jobName")
: "jobName" ➡️ Job을 실행시킬 때 참조하는 Job의 이름 (DB에도 저장)JobBuilderHelper
내부 static 클래스로 CommonJobProperties
를 갖고 있음 ➡️ 이를 필드값으로 갖고 있어 Job을 생성하는 공통적인 내용이 저장됨JobBuilderFactory
에서 JobBuilder
를 생성할 때, 생성자의 인자로 JobRepository
를 넘기는데 이게 JobBuilder
에 CommonJobProperties
에 담김JobRepository
는 빌더 클래스를 통해 Job객체에 전달되어 메타데이터를 기록
하는데 사용@Bean
public Step step3() {
return stepBuilderFactory.get("step3")
.tasklet((contribution, chunkContext) -> {
chunkContext.getStepContext().getStepExecution().setStatus(BatchStatus.FAILED);
contribution.setExitStatus(ExitStatus.STOPPED);
System.out.println(">> step3 has executed");
return RepeatStatus.FINISHED;
})
.build();
}
start(step)
: 처음 실행할 Step 설정. 최초 한 번 설정, SimpleJobBuilder가 생성되고 반환next(step)
: 여러 번 설정 가능. 모든 next()의 Step이 종료되면 Job이 종료
DefaultJobParametersValidator
// 1st Parameter : requiredKeys, 2nd Parameter : optionalKeys
new DefaultJobParametersValidator(new String[]{"name", "date"}, new String[]{"count"})
public abstract class JobBuilderHelper<B extends JobBuilderHelper<B>> {
public B preventRestart() {
properties.restartable = false;
@SuppressWarnings("unchecked")
B result = (B) this;
return result;
}
}
preventRestart()
를 설정했기에 불가능하다.
public class CustomJobParametersIncrementer implements JobParametersIncrementer {
static final SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd-hhmmss");
@Override
public JobParameters getNext(JobParameters parameters) {
String id = format.format(new Date());
return new JobParametersBuilder().addString("run.id", id).toJobParameters();
}
}
@Bean
public Job batchJob() {
return this.jobBuilderFactory.get("batchJob")
.start(step1())
.next(step2())
.incrementer(new CustomJobParametersIncrementer())
.build();
}
재시작을 해도 에러를 내뱉지않고 정상작동
run.id
: 다시 실행하기 위한 목적으로 생성한 JobParameters
.incrementer(new RunIdIncrementer())
JobLauncher
는 SimpleJob
과 Jobparameters
를 갖고 Job 실행JobListener
에서 beforeJob
호출StepExecution
과 ExecutionContext
생성JobListener
에서 afterJob
호출