Spring Batch中的LoopDecider步骤始终运行

时间:2019-05-20 09:18:48

标签: spring-batch

我在一个春季批处理工作中面临以下问题。 以下是高级职位。

<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)无论抛出什么异常,Job始终进入 Complete状态。仅当 LoopDecider 完成步骤

时,它才会完成

在抛出异常并阻止 imitDeciderStep 运行时,有什么方法可以使我们执行最高工作

编辑:

我完全删除了 LoopDecider ,但观察到了相同的行为。 即使从 Writer afterStep 方法抛出异常,作业也不会进入 FAILED 状态 ItemWriterStepExecutionListener是Writer类中提供的StepexecutionListener

由于我正在Writer afterStep 中进行所有最终处理,因此正在从 Writer afterStep 引发异常。

下面是伪代码。

 @Override
    public ExitStatus afterStep(StepExecution stepExecution) {


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

由于 afterStep 中的抛出异常,作业不会进入失败状态?

编辑2: 经过进一步分析,我发现了以下内容:

1)我从afterStep方法以 FAILED 返回了退出状态。此后将不调用LoopDecider。由于状态未设置为 FAILED

,因此它正在通话

2)但是在这种情况下,即使ExitStatus为FAILED,spring batch也不会在控制台上显示错误,因为我们没有抛出任何异常而是返回了ExitStatus。

3)关于如何获取作业状态为FAILED的问题仍然存在,但是在其上下文中带有Spring Batch日志异常消息

0 个答案:

没有答案