我在Spring Batch中设置了一个有点线性的工作,包括几个步骤。如果在任何时候,单个步骤失败,则该作业应该失败。
这些步骤包括许多tasklet,然后是基于块的步骤。即:
如果出现问题,显而易见的事情就是抛出异常。 Spring Batch将处理此事并记录所有内容。这种行为,特别是打印堆栈跟踪,是不可取的,如果可以在Status设置为FAILED
的情况下优雅地结束Job,那就更好了。
Tasklets目前将ExitStatus
直接设置在StepContribution
上。它们也是使用流程构建的(这不是理想的,但步骤继续不受阻碍)。然后可以直接在Tasklet中处理这些问题。
但是,我们无法在基于块的方法中访问StepContribution
。我们只有StepExecution
。使用setExitStatus
在这里什么都不做。
我们正在使用构建器(JobBuilerFactory
和StepBuilderFactory
),而不是XML设置。
@AfterStep
时,Spring Batch已经捕获了异常。StepContribution
的替代值。据我所知,停止这项工作的唯一方法就是抛出异常。没有其他优雅的方式告诉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生成的堆栈跟踪,但仍会显示错误消息。
我想你可以探索以下两个选项。
选项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;
}
}
}
希望这可以帮助