0

My Spring Batch Job configuration has 5 steps, all of which are identical except for the reader. Is there a way I can abstract out all of the other parts of the step into a "parent" step, so that I don't need to repeat everything? I know this can be done in XML, but I can't figure out the java equivalent.

Here's one of the steps:

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();
}

Here's the definition of one of the readers:

@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;
}
CNDyson
  • 1,687
  • 7
  • 28
  • 63

1 Answers1

1

You can do something like:

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();
}
Mahmoud Ben Hassine
  • 28,519
  • 3
  • 32
  • 50