春季批处理异常侦听器



我有一个分区的 Spring 批处理作业,它读取多个拆分的 CSV 文件并在各自的线程中处理每个文件,然后将结果写入相应的输出文件。

如果一个项目无法处理(抛出异常(,我想将该结果写入错误文件。有没有办法添加可以处理此问题的编写器或侦听器?

更进一步,有没有办法按异常类型将其拆分并将不同的异常写入不同的文件?

您可以通过

指定SkipPolicy来实现此目的。实现此接口并添加自己的逻辑。

public class MySkipper implements SkipPolicy {
    @Override
    public boolean shouldSkip(Throwable exception, int skipCount) throws SkipLimitExceededException {
       if (exception instanceof XYZException) {
            //doSomething
       }
         ......
  }

您可以在批处理中指定此跳过策略。

this.stepBuilders.get("importStep").<X, Y>chunk(10)
        .reader(this.getItemReader()).faultTolerant().skipPolicy(....)
        .processor(this.getItemProcessor())
        .writer(this.getItemWriter())
        .build();

我看到这样做的一种方法是通过SkipPolicySkipListener的组合。

该策略将允许您跳过引发异常的项目,例如FlatFileParseException(可以配置可跳过的异常(。

侦听器允许您访问Throwable和导致它的项目(或者在读取的情况下只是 Throwable(。 跳过侦听器还允许您区分读取/处理器/写入器中的跳过(如果要单独处理这些跳过(。

public class ErrorWritingSkipListener<T, S> implements SkipListener<T, S> {
  @Override
  public void onSkipInRead(final Throwable t) {
     // custom logic
  }
  @Override
  public void onSkipInProcess(final T itemThatFailed, final Throwable t) {
      // custom logic
  }
  @Override
  public void onSkipInWrite(final S itemThatFailed, final Throwable t) {
    // custom logic
  }
}

我建议仅使用 SkipPolicy 来识别要写出到各种文件的异常,并利用SkipListener来执行实际的文件写入逻辑。这将与它们的接口定义的预期用途非常匹配。

最新更新