반응형
728x90
반응형
@JobScope와 @StepScope 개념
- 해당 어노테이션이 선언되면 생성이 어플리케이션 구동 시점이 아닌 빈의 실행 시점에 이루어진다.
스프링의 @Bean 어노테이션은 스프링이 초가화되는 시점에 빈이 생성된 후 관리된다. 스프링 배치에서 @JobScope, @StepScope 어노테이션은 어플리케이션이 실제로 실행되는 시점에 생성된다.
- 스코프를 프록시 모드를 기본값으로 하기 때문에, 어플리케이션 구동 시점에는 빈의 프록시 객체가 생성되어 실행 시점에 실제 빈을 호출해준다.
@JobScope
- Step 선언시에 사용한다.
- @Value : jobParameters, jobExecutionContext 만 사용 가능하다.
@StepScope
- Tasklet 이나 ItemReader, ItemWriter, ItemProcessor 선언문에 사용한다.
- @Value : jobParameter, jobExecutionContext, stepExecutionContext 사용 가능하다.
실행 예제
- 실행 설정
--job.name=jobScopeStepScopeJob message=20210101
- application.yml
batch:
...
job:
enabled: false # spring batch 자동실행 방지
names: ${job.name:NONE}
- - Job
@Bean
public Job jobScopeStepScopeJob() {
return this.jobBuilderFactory.get("jobScopeStepScopeJob")
/* step start */
.start(jobScopeStepScopeStep1(null))
.next(jobScopeStepScopeStep2())
.listener(new JobExecutionListener() {
@Override
public void beforeJob(JobExecution jobExecution) {
jobExecution.getExecutionContext().putString("name", "user1");
}
@Override
public void afterJob(JobExecution jobExecution) {
}
})
.build();
}
- - Step1
@Value("#{jobParameters['message']}") String message
@Bean
@JobScope
public Step jobScopeStepScopeStep1(@Value("#{jobParameters['message']}") String message) {
System.out.println("message = " + message);
return stepBuilderFactory.get("jobScopeStepScopeStep1")
.tasklet(tasklet1(null))
.listener(new StepExecutionListener() {
@Override
public void beforeStep(StepExecution stepExecution) {
stepExecution.getExecutionContext().putString("name2", "user");
}
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
return null;
}
})
.build();
}
- - Tasklet1
@Value("#{jobExecutionContext['name']}") String name
@StepScope
public Tasklet tasklet1(@Value("#{jobExecutionContext['name']}") String name) {
System.out.println("name = " + name); // .putString("name", "user1");
return (stepContribution, chunkContext) -> {
System.out.println("tasklet1 has executed");
return RepeatStatus.FINISHED;
};
}
- - Step2
@Bean
public Step jobScopeStepScopeStep2() {
return stepBuilderFactory.get("jobScopeStepScopeStep2")
.tasklet(tasklet2(null))
.build();
}
- - Tasklet2
@Value("#{stepExecutionContext['name2']}") String name2
@StepScope
public Tasklet tasklet2(@Value("#{stepExecutionContext['name2']}") String name2) {
System.out.println("name2 = " + name2); // .putString("name2", "user");
return (stepContribution, chunkContext) -> {
System.out.println("tasklet1 has executed");
return RepeatStatus.FINISHED;
};
}
반응형