Я использую Spring с Spring-Batch vesrion 4.0.1 и Spring-Boot verion 2.0.6
У меня возникают некоторые проблемы, когда я использую аннотации @JobScope или @StepScope для Step bean, когда он используется в работесборка с переходами.
Я проиллюстрирую мою проблему на простом примере:
@EnableBatchProcessing
@Configuration
public class ExampleJobConfig {
private static final Logger LOG = LoggerFactory.getLogger(ExampleJobConfig.class);
@Autowired
private JobBuilderFactory jobBuilderFactory;
@Autowired
private StepBuilderFactory stepBuilderFactory;
@Bean
public Job simpleExampleJob() {
return jobBuilderFactory.get("simpleExampleJob")
.start(simpleExampleStep(null)).on("COMPLETED").end()
.from(simpleExampleStep(null)).on("*").fail()
.end()
.build();
}
@Bean
@JobScope
public Step simpleExampleStep(@Value("#{jobParameters['myParam']}") String myParam) {
return stepBuilderFactory.get("simpleExampleStep")
.tasklet(simpleExampleTasklet(myParam))
.build();
}
public Tasklet simpleExampleTasklet(String param) {
return (contribution, chunkContext) -> {
LOG.debug(param);
return RepeatStatus.FINISHED;
};
}
}
Этот код вызывает исключение org.springframework.beans.factory.BeanCreationException:
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scopedTarget.simpleExampleStep': Scope 'job' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for job scope
...
Caused by: java.lang.IllegalStateException: No context holder available for job scope
...
Но с этим объявлением задания этот код работает нормально:
@Bean
public Job simpleExampleJob() {
return jobBuilderFactory.get("simpleExampleJob")
.start(simpleExampleStep(null))
.build();
}
Я не понимаю, почему он не работает с переходами, потому что он работает с тем же кодом, но без переходов.
Можете ли вы помочь мне понять, пожалуйста :)?