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

问题描述 投票:1回答:2

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

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

  • 步骤1 Tasklet 1
  • 第2步 Tasklet 2
  • 第3步 读者 处理器 作家

如果出现问题,显而易见的事情就是抛出异常。 Spring Batch将处理此事并记录所有内容。这种行为,特别是打印堆栈跟踪,是不可取的,如果可以在Status设置为FAILED的情况下优雅地结束Job,那就更好了。

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

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

我们正在使用构建器(JobBuilerFactoryStepBuilderFactory),而不是XML设置。

The potential solutions:

  1. 告诉或配置Batch如何处理异常(不打印堆栈跟踪)。
  2. 在侦听器中捕获异常。不幸的是,当它到达@AfterStep时,Spring Batch已经捕获了异常。
  3. 告诉步骤/作业我们不想继续(例如在执行上下文中设置值或StepContribution的替代值。
java spring exception-handling spring-batch chunks
2个回答
1
投票

据我所知,停止这项工作的唯一方法就是抛出异常。没有其他优雅的方式告诉Spring Batch“这项工作已完成,失败,直接进入失败,不通过GO等”

虽然不是原始问题的直接解决方案,但可以使用.exceptionHandler()StepBuilder来获得对你抛出的异常的更多控制,例如:记录它们。

public class LogAndRethrowExceptionHandler implements ExceptionHandler {
    private static final Logger LOGGER = Logger.getLogger(...);

    @Override
    public void handleException(RepeatContext repeatContext, Throwable throwable) throws Throwable {
        LOGGER.error(throwable.getMessage());
        throw throwable;
    }
}

这样,理论上,您可以隐藏Spring Batch生成的堆栈跟踪,但仍会显示错误消息。


0
投票

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

选项1:您可以使用noSkip例外。

这会明确阻止某些异常(和子类)被跳过抛出一些您希望失败的特定异常。

这是你如何配置帽子

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;
    }
 }

 }

希望这可以帮助

© www.soinside.com 2019 - 2024. All rights reserved.