Ожидание завершения задания Spring Batch, но переход к следующему шагу

Я унаследовал задание Spring Batch и пытаюсь понять следующее поведение.

Исключение было выброшено в configIBMTCompletionProcessor (ConfigIBMTCompletionProcessor.java) шага VerifyPreditErrors, и я ожидаю, что работа остановится в соответствии с определением шага.

Потому что выброшенное исключение ConfigIBMTCompletionProcessor.java должно привести к тому, что afterStep() в ConfigIBMTCompletionWriter.java вернется ExitStatus.NOOP. Таким образом, все пакетное задание должно завершиться.

Но этот шаг был отмечен как ABANDONED и мы перешли к следующему шагу IBMTFileCopy.

Определение шагов XML

        <batch:step id = "VerifyPreditErrors">
            <batch:tasklet>
                <batch:chunk reader = "iinnoOpReader" writer = "compositeIBMTCompletionWriter" processor = "configIBMTCompletionProcessor"
                    commit-interval = "1">
                </batch:chunk>
            </batch:tasklet>
            <batch:next on = "FAILED" to = "IBMTFileCopy"/>
            <batch:next on = "SUCCESS" to = "IBMTFetchDataCreateReport"/>
            <batch:end on = "NOOP"/>
            <batch:listeners>
                <batch:listener ref  = "configIBMTCompletionWriter"></batch:listener>
            </batch:listeners>
        </batch:step>

        <batch:step id = "IBMTFileCopy" >
            <batch:tasklet ref = "fileCopyTasklet">
            </batch:tasklet>
        </batch:step>   

Определение XML-компонентов

    <bean id = "compositeIBMTCompletionWriter" class = "org.springframework.batch.item.support.CompositeItemWriter" scope = "job">
        <property name = "delegates">
            <list>
                <ref bean = "configIBMTCompletionWriter" /> <!-- This will update the tables if no pre-edit errors, otherwise send an email -->
                <ref bean = "flatFileItemWriterWrapper" /> <!-- This will create a file only if pre-edit errors are found. -->
            </list>
        </property>
    </bean>

    <bean id = "configIBMTCompletionProcessor" class = "com.companyName.coreconfig.batch.processor.ConfigIBMTCompletionProcessor" />

    <bean id = "configIBMTCompletionWriter" class = "com.companyName.coreconfig.batch.writer.IBMTCompletionWriter" scope = "step">
        <property name = "fileName" value = "IBMT_ERR_RPT_#{jobParameters[dt]}.csv"/>
    </bean>

Определение Java

Компонент configIBMTCompletionWriter (ConfigIBMTCompletionWriter.java)

public class ConfigIBMTCompletionWriter implements ItemWriter<List<CustomParams>>,
    StepExecutionListener {

  @Override
  public void write(List<? extends List<CustomParams>> items) throws Exception {    
  ...
  }

  @Override
  public ExitStatus afterStep(StepExecution stepExecution) {
    logger.info("Setting the step status as: " + status);
    if (status.equals(Constants.SUCCESS)) {
      return new ExitStatus(Constants.SUCCESS);
    } else if (status.equals(Constants.FAILED)) {
      return new ExitStatus(Constants.FAILED);
    }
    return ExitStatus.NOOP;
  }

  @Override
  public void beforeStep(StepExecution stepExecution) {}
}

В журналах я вижу напечатанный журнал afterStep:

335601  main    INFO    com.companyName.coreconfig.batch.writer.ConfigIBMTCompletionWriter  ConfigIBMTCompletionWriter.java:169 Setting the step status as: null

Компонент configIBMTCompletionProcessor (ConfigIBMTCompletionProcessor.java)

public class ConfigIBMTCompletionProcessor implements
    ItemProcessor<String, List<CustomParams>>, StepExecutionListener {
  // fetch data from DB
  String status = service.fetchBatchWorkStatus();

  case (status) {
    ...
    case Constants.FAILED:
      throw Exception(...);
    ...
  }
}

  @Override
  public void beforeStep(StepExecution stepExecution) {
    // some pre-processing 
  }

  @Override
  public ExitStatus afterStep(StepExecution stepExecution) {
    // TODO Auto-generated method stub
    return null;
  }

Прилагается изображение с подробными сведениями об этапах пакетного задания:

Вопросы

  1. Почему задание перешло к этапу IBMTFileCopy? Даже когда метод afterStep() в ConfigIBMTCompletionWriter.java вернулся ExitStatus.NOOP.

  2. Почему шаг VerifyPreditErrors отмечен как ЗАБРОШЕННЫЙ?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

удалось разобраться.

Есть 2 проблемы:

  1. ExitStatus шага VerifyPreditErrors
  2. Неправильное использование batch:end

ExitStatus шага VerifyPreditErrors

Поскольку шаг VerifyPreditErrors имеет фрагментарный подход (реализованный с помощью Reader, Processor и Writer), исключение, создаваемое в процессоре (ConfigIBMTCompletionProcessor), означает, что Writer (ConfigIBMTCompletionWriter) не выполняет свою write() логику.

В результате переменная status в ConfigIBMTCompletionWriter.java по-прежнему будет null. Когда ConfigIBMTCompletionWriter.afterStep() запускается, возникает NullPointerException и ExitStatus (batch_step_execution.EXIT_CODE) не обновляется с FAILED на NOOP, как предполагалось.

Неправильное использование batch:end

Шаг VerifyPreditErrors в конфигурации задания (файл XML) был настроен следующим образом:

        <batch:step id = "VerifyPreditErrors">
            <batch:tasklet>
                <batch:chunk reader = "iinnoOpReader" writer = "compositeIBMTCompletionWriter" processor = "configIBMTCompletionProcessor"
                    commit-interval = "1">
                </batch:chunk>
            </batch:tasklet>
            <batch:next on = "FAILED" to = "IBMTFileCopy"/>
            <batch:next on = "SUCCESS" to = "IBMTFetchDataCreateReport"/>
            <batch:end on = "NOOP"/>
            <batch:listeners>
                <batch:listener ref  = "configIBMTCompletionWriter"></batch:listener>
            </batch:listeners>
        </batch:step>

Это означает, что даже если ExitStatus был правильно обновлен до NOOP, пакетное задание завершится со статусом COMPLETED, что неверно в контексте нашей бизнес-логики.

Другие вопросы по теме