Spring-Batch @StepScope и @JobScope не работают для шага, используемого в задании с переходами - PullRequest
1 голос
/ 08 апреля 2019

Я использую 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();
    }

Я не понимаю, почему он не работает с переходами, потому что он работает с тем же кодом, но без переходов.

Можете ли вы помочь мне понять, пожалуйста :)?

...