Как сделать шаг Spring Batch зависит от предыдущего шага?

Я использую Spring Batch для чтения некоторых данных из файлов CSV и помещения их в базу данных. Моя пакетная работа должна состоять из 2 шагов:

  1. Проверьте файлы (имена, расширение, содержание..)
  2. Чтение строк из CSV и сохранение их в БД (ItemReader, ItemProcessor, ItemWriter..)

Step 2 не должен быть выполнен, если Step 1 генерируется ошибка (файлы не соответствуют, файлы не существуют...)

К вашему сведению, я использую Spring Batch без конфигурации XML! Только аннотации: Вот как выглядит мой класс конфигурации работы:

@Configuration
@EnableBatchProcessing
public class ProductionOutConfig {

    @Autowired
    private StepBuilderFactory steps;

    @Autowired
    private JobBuilderFactory jobBuilderFactory;


    @Autowired
    private ProductionOutTasklet productionOutTasklet;

    @Autowired
    private CheckFilesForProdTasklet checkFilesForProdTasklet;

    @Bean
    public Job productionOutJob(@Qualifier("productionOut")Step productionOutStep,
                                @Qualifier("checkFilesForProd") Step checkFilesForProd){
        return jobBuilderFactory.get("productionOutJob").start(checkFilesForProd).next(productionOutStep).build();
    }

    @Bean(name="productionOut")
    public Step productionOutStep(){
        return steps.get("productionOut").
                tasklet(productionOutTasklet)
                .build();}

    @Bean(name = "checkFilesForProd")
    public Step checkFilesForProd(){
        return steps.get("checkFilesForProd")
                .tasklet(checkFilesForProdTasklet)
                .build();
    }
}

2 ответа

Решение

То, что вы ищете, уже является поведением Spring Batch по умолчанию, т.е. следующий шаг не будет выполнен, если предыдущий шаг не удался. Чтобы пометить текущий шаг как шаг с ошибкой, необходимо сгенерировать исключение времени выполнения, которое не было перехвачено.

Если исключение не обработано, пакетная пружина пометит этот шаг как неудачный, и следующий шаг не будет выполнен. Так что все, что вам нужно сделать, это выбросить исключение в ваших неудачных сценариях.

Для сложных потоков работ, вы можете использовать - JobExecutionDecider, Программные решения потока

Как указано в документации, вы можете использовать метод "on", который запускает переход в новое состояние, если состояние выхода из предыдущего состояния соответствует заданному шаблону.

Ваш код может быть похож на что-то вроде этого:

    return jobBuilderFactory.get("productionOutJob")
           .start(checkFilesForProd)
           .on(ExitStatus.FAILED.getExitCode()).end()
           .from(checkFilesForProd)
           .on("*")
           .to(productionOutStep)
           .build();
Другие вопросы по тегам