인프런 커뮤니티 질문&답변

가릿님의 프로필 이미지
가릿

작성한 질문수

스프링 배치

JobStep

childJob 두번 실행

작성

·

542

0

안녕하세요. 강의 정말 잘 듣고 있습니다.

한가지 질문이 있어 이렇게 글 올립니다.

JobStep강의에서 childJob을 두번실행하는 경우가 발생합니다.

1. jobStep -> childJob 실행, StepExecutionListener를 이용하여 파라미터 값 {name: "user1"}의 값을 넣어줌

2. @Bean으로 인해서 스프링 컨테이너에서 DI되어 childJob을 한번 더 실행 이때는 파라미터 값 {}임

제가 생각했을때는 childJob에서 저 @Bean을 빼야하는거 같은데 혹시 이게 맞나요??

아니면 저만 그런건가요

답변 5

1

정수원님의 프로필 이미지
정수원
지식공유자

위 소스를 그대로 실행해 보니 childJob  이 두번 실행되는 현상은 발생하지 않고 있습니다.

1 : parentJob  실행

2 : jobStep 실행

3 : childJob 실행,  JobParameters 에 {name:user1} 저장

4 : step1 실행

5 : step1 의 tasklet 실행

6 : step1 실행 완료

7 : childJob 실행완료

8 : jobStep 실행완료

9 : step2 실행

10 : step2 실행완료

11 : parentJob 실행완료

순으로 실행이 정상적으로 이루어지고 있습니다.

이미지는 다른이름으로 저장한다음 보시거나 브라우저를 확대해서 보시면 됩니다.

다시 한번 확인해 보시기 바랍니다.

0

정수원님의 프로필 이미지
정수원
지식공유자

죄송하지만 전체 소스 공유 부탁드립니다

제가 실행하는 환경이나 소스가 동일한지 확인이 필요할 것 같습니다

0

안녕하세요. 저도 윗 분과 동일하게 childJob이 두 번 실행되는 현상이 있습니다. 코드는 정수원님의 깃헙에 있는 코드와 동일하게 실행하였고,  args = --job.name=parentJob date=20220309 로 하였습니다.

디버그로 확인해보니, jobStep으로 childJob이 실행되고, 맨 마지막에 childJob 별도의 Job으로 실행되었습니다.

1 : parentJob  실행

2 : jobStep 실행

3 : childJob 실행,  JobParameters 에 {name:user1} 저장

4 : step1 실행

5 : step1 의 tasklet 실행

6 : step1 실행 완료

7 : childJob 실행완료

8 : jobStep 실행완료

9 : step2 실행

10 : step2 실행완료

11 : parentJob 실행완료

12 : childJob 실행 

13 : step1 실행

14 : childJob 종료

0

가릿님의 프로필 이미지
가릿
질문자

답변이 늦어서 죄송합니다.

밑에 소스공유하겠습니다.

 

 

 

import lombok.RequiredArgsConstructor;
import org.springframework.batch.core.*;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.scope.context.ChunkContext;
import org.springframework.batch.core.step.job.DefaultJobParametersExtractor;
import org.springframework.batch.core.step.job.JobParametersExtractor;
import org.springframework.batch.core.step.tasklet.Tasklet;
import org.springframework.batch.repeat.RepeatStatus;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@RequiredArgsConstructor
public class JobStepConfiguration {

private final JobBuilderFactory jobBuilderFactory;
private final StepBuilderFactory stepBuilderFactory;

@Bean
public Job parentJob(){
return jobBuilderFactory.get("parentJob")
.start(jobStep(null))
.next(step2())
.build();
}

@Bean
public Step jobStep(JobLauncher jobLauncher) {
return stepBuilderFactory.get("jobStep")
.job(childJob())
.launcher(jobLauncher)
.parametersExtractor(jobParametersExtractor())
.listener(new StepExecutionListener() {
@Override
public void beforeStep(StepExecution stepExecution) {
stepExecution.getExecutionContext().putString("name","user1");
}

@Override
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
})
.build();
}


private JobParametersExtractor jobParametersExtractor() {
DefaultJobParametersExtractor extractor = new DefaultJobParametersExtractor();
extractor.setKeys(new String[]{"name"});
return extractor;
}

@Bean
public Job childJob() {
return jobBuilderFactory.get("childJob")
.start(step1())
.build();
}

@Bean
public Step step1() {
return stepBuilderFactory.get("step1")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
System.out.println("step1 was executed");
// throw new RuntimeException("childJob was failed");
return RepeatStatus.FINISHED;
}
})
.build();
}

@Bean
public Step step2() {
return stepBuilderFactory.get("step2")
.tasklet(new Tasklet() {
@Override
public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

return RepeatStatus.FINISHED;
}
})
.build();
}

}

0

정수원님의 프로필 이미지
정수원
지식공유자

강의와 동일한 소스에서 실행하는건가요?

아니면 소스 공유 가능할까요?

가릿님의 프로필 이미지
가릿

작성한 질문수

질문하기