如果文件中的单个项目验证失败,如何停止向ItemWriter发送项目?

时间:2016-01-12 08:35:18

标签: validation spring-batch

我有一个包含10个项目的文件,并且提交间隔被设置为10.我正在过滤项目处理器中的项目以获取验证错误。

说...如果1或2项未通过验证并在项目处理器中过滤,则项目编写器将接收剩余的8个项目并进行处理。

如果甚至单个项目在项目处理器中被过滤,有没有办法过滤所有未被发送到Item Writer的项目?

由于

1 个答案:

答案 0 :(得分:0)

在读取,处理或写入期间抛出Exception时的默认Spring Batch行为是FAIL即时整个步骤。

也就是说,您只需在流程方法中抛出Exception即可防止将commit-interval中的所有项目发送给作者。

@Override
public O process(I item) {

     if (condition) {
          throw new Exception("Item failed validation");
     }
}

现在,正如我所说,你的步骤将FAIL,这可能不是你想要的行为。为了防止这种情况,您可以举例说明自定义Exception类并使用它而不是基本Exception。然后,您可以在块上配置skip logic,让步骤完成处理其他项目:

<batch:chunk commit-interval="10" skip-limit="1000000000">
    <batch:skippable-exception-classes>
         <batch:include class="xx.xx.xx.CustomException" />
    </batch:skippable-exception-classes>
</batch:chunk>

现在,如果您希望步骤完成,但不处理剩余的项目,您可以在抛出Exception之前设置一个标志,并在处理过程中进行检查。如果设置为true,则返回null(跳过所述项),如果处理不正常。