작성
·
337
·
수정됨
0
job:
names: ${job.name:NONE}
설정하고 --job.name=parentjob 설정했습니다.
그럼 parentJob실행이 됩니다.
근데 childJob은 왜 실행되는건가요?
joblauncher 값을 null 로 주어서 인가요?
답변 2
0
프로그램 변수 --job.name=parentjob1
job:
names: ${job.name:NONE}
# enabled: false
@Slf4j
@RequiredArgsConstructor
@Configuration
public class JobStepConfiguration {
private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;
@Bean
public Job parentJob(){
return jobBuilderFactory.get("parentJob1")
.start(jobStep(null))
.next(step2())
.build();
}
@Bean
public Step jobStep(JobLauncher jobLauncher){
return stepBuilderFactory.get("jobStep1")
.job(childJob())
.launcher(jobLauncher)
.parametersExtractor(jobParametersExtractor())
.listener(new StepExecutionListener() {
@Override
public void beforeStep(StepExecution stepExecution) {
stepExecution.getExecutionContext().putString("name", "user2");
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
})
.build();
}
private DefaultJobParametersExtractor jobParametersExtractor() {
DefaultJobParametersExtractor extractor = new DefaultJobParametersExtractor();
extractor.setKeys(new String[]{"name"});
return extractor;
}
@Bean
public Job childJob(){
return jobBuilderFactory.get("childJob1")
.start(step1())
.build();
}
@Bean
public Step step1(){ //TaskletStepBuilder
return stepBuilderFactory.get("Step1")
.tasklet((a, b) ->{
log.info("Step1 확인");
return RepeatStatus.FINISHED;
})
.build();
}
@Bean
public Step step2(){
return stepBuilderFactory.get("Step2")
.tasklet((a, b) ->{
log.info("Step2 확인");
return RepeatStatus.FINISHED;
})
.build();
}
}
프로그램 변수로 인해서 parentJob1은 자동 실행 됩니다. 근데 childJob은 왜 자동 실행되는건가요?
(강의 코드와 동일하고 결과도 동일합니다)
0
jobStep 은 내부에 별도의 Job 객체를 포함하고 있는 구조입니다.
위에서 childJob() 이 Step 에 저장됩니다
그리고 위 설정에서 parentJob 이 실행되면 jobStep 이 실행되고 실행 중 내부에 저장하고 있는 childJob 을 실행하도록 되어 있습니다.
그러기 위해서 jobLauncher 를 별도로 저장하고 있습니다.
그게 jobStep 의 특징입니다.
강의 내용을 찬찬히 들어보시길 권해 드립니다.