LoopDecider Step in Spring Batch всегда выполняется - PullRequest
0 голосов
/ 20 мая 2019

Я столкнулся с проблемой ниже в одном из рабочих заданий Spring.Ниже работа на высоком уровне.

<job id="SomeJobId">

      <step id="preValidationStep">
        <tasklet ref="someTaskLetRef"/>
        <next on="COMPLETED" to="actualStepId"/>
        <end on="NO-OP"/>         
      </step>

      <!-- this step runs in a loop -->
      <step id="actualStepId" next="limitDeciderStep">
        <tasklet>
            <chunk reader="reader" processor="processor" 
            writer="writer" commit-interval="1">
            </chunk>

             <listeners>
                  <listener ref="ItemWriterStepExecutionListener"/>           
             </listeners>
        </tasklet>
      </step>

      <!-- this is limit decider  -->
      <decision id="limitDeciderStep" decider="limitDeciderBean">
            <next on="CONTINUE" to="actualStepId" />
            <end on="COMPLETED" />
      </decision>



</job>

Код писателя добавлен здесь:

public class ItemWriter implements ItemWriter<Record>,StepExecutionListener{

private List<Record> records ; // it holds all records to process in afterStep 

public ItemWriter() {
    super();
}

@Override
public void write(List<? extends Record> recepients) throws Exception {

    // this is do nothing method 
    // It just accumulates records and stores in Writer like record.add();

}


@override
public ExitStatus afterStep(StepExecution stepExecution) {

  try{

    // do some processong for all the records accumulated 
    return new ExitStatus("SUCCESS");


  }catch(Exception ex){

        // we want to get exception trace printed here by Spring Batch framework 
        // throwing exception is not helping here . LoopDecider gets called and status is COMPLETED
        //If ExitStatus("FAILED") is used , Job status is FAILED , but  we loose the exception stack trace as no exception is thrown .          
        return new ExitStatus("FAILED"); 
  }


}

@override
public void beforeStep(StepExecution stepExecution){

    //initliase records 
    records = new ArrayList<String>();

}

}

Как показано в коде высокого уровня выше -

1) actualStepId выполняется в цикле

2) Логика цикла определяется limitDeciderStep

Проблема: 1) Даже когда actualStepId Шаг бросков ЛЮБОЕ ИСКЛЮЧЕНИЕ (я кидаю от писателя), limitDeciderStep всегда работает

2) В идеале, limitDeciderStep не должен запускаться, а задание должно прекращаться

3) Но этого не происходит, и Spring Batch игнорирует выброшенное исключение, а limitDeciderStep всегда выполняется

4) Задание всегдапереходит в полное состояние независимо от того, какое исключение выдается.Он завершается только тогда, когда LoopDecider получает шаг к завершению

Есть ли какой-нибудь способ, которым мы можем выполнить верхнее задание при возникновении исключения и предотвратить imitDeciderStep работает?

РЕДАКТИРОВАТЬ:

Я удалил LoopDecider в целом, но наблюдается то же поведение.Задание не переходит в состояние FAILED , даже когда исключение выдается из Writer afterStep Метод ItemWriterStepExecutionListener является StepexecutionListener, предоставленным в классе Writer

Исключение выдается из Writer afterStep , поскольку я выполняю всю окончательную обработку в Writer afterStep .

Ниже приведен псевдокод.

 @Override
    public ExitStatus afterStep(StepExecution stepExecution) {


       try{          
          //do some processing 
       }catch(Exception ex){
            throw new RunTimeException(ex);
       }                 
    }

Задание не переходит в состояние сбоя из-за исключения исключения из afterStep ?

РЕДАКТИРОВАТЬ 2: После дальнейшего анализа я обнаружил следующие вещи:

1) Я возвратил статус выхода как FAILED из afterStep метода,После этого LoopDecider не вызывается.Он вызывался раньше, так как статус не установлен как FAILED

2) Но в этом случае, даже когда ExitStatus не работает, весенний пакет не показывает ошибку на консоли, так как мы невыдает любые исключения, но возвращает ExitStatus.

3) Проблема по-прежнему заключается в том, как получить статус задания как СБОЙ, но с сообщением об исключении журнала Spring Batch в его контексте

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...