Spring Batch - Использование ExitStatus для управления потоком
У меня есть приложение Spring Batch с использованием Spring-Boot (без конфигурации XML). Я пытаюсь понять полезность ExitStatus в моем приложении. В конце одного из шагов мне нужно выполнить инструкцию обновления SQL. Я достигаю этого, имея StepExecutionListener, как показано ниже:
@Component
public class MyListener extends StepListenerSupport{
@Autowired
JdbcTemplate jdbcTemplate;
@Transactional
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
jdbcTemplate.execute("some SQL update);
return null;
}
}
Как видите, я возвращаюсь null
как ExitStatus, и это, кажется, работает нормально. Тем не менее, я не уверен, что это правильно, или мне нужно вернуть какое-то конкретное значение для ExitStatus?
1 ответ
Возврате null
здесь эффектно сказано "не перекрывай ExitStatus
Вы уже собирались использовать ".
Полезность приходит потому, что, если ваш SQL-оператор завершится неудачно (и предположительно выдает исключение), шаг НЕ ПРОЙДЕТ. Вместо этого он продолжит счастливо переходить к следующему шагу в вашей работе.
Вам нужно поймать исключение и вернуть ExitStatus.FAILED
провалить шаг и работу.
В качестве альтернативы, допустим, у вас есть сценарий, в котором вы хотите выполнить какое-то управление потоком на основе действия на шаге... возможно, это был этап подготовки, и вы хотите завершить, если нет записей для обработки, но выполните какой-то дополнительный шаг если бы были записи на сцену. Тогда вы можете сделать что-то вроде этого:
@Override
public ExitStatus afterStep(StepExecution stepExecution) {
if (stepExecution.getReadCount() > 0) {
return ExitStatus.COMPLETED;
}
return ExitStatus.NOOP;
}
Тогда в вашей конфигурации работы вы можете сделать:
jobBuilderFactory.get("myJob")
.start(step1()).on("NOOP").end()
.from(step1()).on("COMPLETED").to(step2()).end()
.from(step1()).on("*").fail()
.build();