Как сделать шаг Spring Batch зависит от предыдущего шага?
Я использую Spring Batch для чтения некоторых данных из файлов CSV и помещения их в базу данных. Моя пакетная работа должна состоять из 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();