• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

JobStep 강의에서 childJob() 실행 질문

22.12.02 17:20 작성 22.12.02 17:21 수정 조회수 241

0

job:
  names: ${job.name:NONE}

설정하고 --job.name=parentjob 설정했습니다.
그럼 parentJob실행이 됩니다.

근데 childJob은 왜 실행되는건가요?
joblauncher 값을 null 로 주어서 인가요?

답변 2

·

답변을 작성해보세요.

0

김나다님의 프로필

김나다

질문자

2022.12.02

프로그램 변수 --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

Job 설정 파일을 볼 수 있을까요?

jobStep 은 내부에 별도의 Job 객체를 포함하고 있는 구조입니다.

@Bean
    public Step jobStep(JobLauncher jobLauncher){
        return stepBuilderFactory.get("jobStep1")
                .job(childJob())
                .launcher(jobLauncher)

위에서 childJob() 이 Step 에 저장됩니다

그리고 위 설정에서 parentJob 이 실행되면 jobStep 이 실행되고 실행 중 내부에 저장하고 있는 childJob 을 실행하도록 되어 있습니다.
그러기 위해서 jobLauncher 를 별도로 저장하고 있습니다.

그게 jobStep 의 특징입니다.
강의 내용을 찬찬히 들어보시길 권해 드립니다.