我有一个分区的 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();
我看到这样做的一种方法是通过SkipPolicy
和SkipListener
的组合。
该策略将允许您跳过引发异常的项目,例如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
来执行实际的文件写入逻辑。这将与它们的接口定义的预期用途非常匹配。