首页 文章

在基于块的步骤中中止批处理作业

提问于
浏览
0

我在Spring Batch中设置了一个有点线性的工作,包括几个步骤 . 如果在任何时候,单个步骤失败,则该作业将失败 .

这些步骤包括许多tasklet,然后是基于块的步骤 . 即:

  • 第1步

  • Tasklet 1

  • 第2步

  • Tasklet 2

  • 第3步

  • 读者

  • 处理器

  • 作家

如果出现问题,显而易见的事情就是抛出异常 . Spring Batch将处理此事并记录所有内容 . 这种行为,特别是打印堆栈跟踪,是不可取的,如果可以在状态设置为 FAILED 的情况下正常结束作业,则会更好 .

Tasklets目前直接在 StepContribution 上设置 ExitStatus . 它们也是使用流程构建的(这不是理想的,但步骤继续不受阻碍) . 然后可以在Tasklet中直接处理这些问题 .

但是,我们无法访问基于块的方法中的 StepContribution . 我们只有 StepExecution . 在这里使用 setExitStatus 什么都不做 .

我们使用的是构建器( JobBuilerFactoryStepBuilderFactory ),而不是XML设置 .

潜在的解决方案:

  • 告诉或配置Batch如何处理异常(不打印堆栈跟踪) .

  • 在侦听器中捕获异常 . 不幸的是,Spring Batch在到达 @AfterStep 时已经捕获到异常 .

  • 告诉步骤/作业我们不想继续(例如在执行上下文中设置值或者 StepContribution 的替代值 .

1 回答

  • 0

    我想你可以探索以下两个选项 .

    Option 1 : 您可以使用 noSkip Exception .

    这显着地防止了某些异常(和子类)被跳过抛出一些您想要使作业失败的特定异常 .

    这是你如何配置帽子

    stepBuilderFactory.get("myStep")
                    .<POJO, POJO> chunk(1000)
                    .reader(reader)
                    .processor(processor)
                    .writer(writer)
                    .faultTolerant()
                    .noSkip(YourCustomException.class)
                    .skip(Exception.class)
                    .skipLimit(100)
    

    ****选项2 **:**您可以使用将退出状态设置为 FAILED ,以便在步骤完成后输入错误流程

    public class MyStepExecutionListener implements StepExecutionListener {
    
        @Override
        public ExitStatus afterStep(StepExecution stepExecution) {
    
    
        if(allIsGood()) // 
        {
             return ExitStatus.COMPLETED;
        }
        else if (someExceptionOrErrorCase()){   
    
            return ExitStatus.FAILED;
        }
     }
    
     }
    

    希望这可以帮助

相关问题