Spring 批处理 - Java 配置中的抽象步骤定义?

Spring Batch - abstract Step definition in Java configuration?

我的 Spring 批处理 Job 配置有 5 个步骤,除了 reader 之外,所有步骤都是相同的。有没有一种方法可以将步骤的所有其他部分抽象为“父”步骤,这样我就不需要重复所有的事情了?我知道这可以在 XML 中完成,但我想不出 java 等价物。

这是其中一个步骤:

public Step quarterlyStep(FileIngestErrorListener listener, ItemReader<DistributionItem> quarterlyReader) {
    return stepBuilderFactory.get("quarterlyStep")
            .<DistributionItem,DistributionItem>chunk(10)
            .reader(quarterlyReader)  // The only thing that changes among 5 different steps
                .listener(listener.asReadListener())
            .processor(processor())
                .listener(listener.asProcessListener())
            .writer(writer())
                .listener(listener.asWriteListener())
            .faultTolerant()
            .skip(ValidationException.class)
            .skip(ExcelFileParseException.class)
            .build();
}

这是 reader 之一的定义:

@Bean
@JobScope
public PoiItemReader<DistributionItem> yearEndReader(@Value("#{jobExecutionContext['filename']}") String filename) {
    PoiItemReader<PortfolioFundsDistributionItem> reader = new PoiItemReader<>();
    reader.setLinesToSkip(1);
    reader.setRowMapper(yearEndRowMapper());
    reader.setResource(new FileSystemResource(filename));
    return reader;
}

您可以这样做:

private StepBuilderFactory stepBuilderFactory;

private SimpleStepBuilder<Integer, Integer> createBaseStep(String stepName) {
    return stepBuilderFactory.get(stepName)
            .<Integer, Integer>chunk(5)
            .processor(itemProcessor())
            .writer(itemWriter());
}

@Bean
public Step step1(ItemReader<Integer> itemReader) {
    return createBaseStep("step1")
            .reader(itemReader)
            .build();
}

@Bean
public Step step2(ItemReader<Integer> itemReader) {
    return createBaseStep("step2")
            .reader(itemReader)
            .build();
}