작성
·
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