在批处理服务中,我使用 MultiResourceItemReader 读取多个 XML 文件,该文件委托(delegate)给 StaxEventItemReader。
如果读取文件时发生错误(例如解析异常),我想指定 Spring 开始读取下一个匹配文件。例如,使用 @OnReadError 注释和/或 SkipPolicy。
目前,当引发读取异常时,批处理会停止。
有人知道怎么做吗?
编辑:我看到 MultiResourceItemReader 有一个方法 readNextItem(),但它是私有(private)的 -_-
最佳答案
我有一段时间没有使用 SB,但在查看 MultiResourceItemReader
代码时,我想您可以编写自己的 ResourceAwareItemReaderItemStream
包装器,在其中检查设置为移动到的标志下一个文件或使用委托(delegate)执行标准读取。
该标志可以存储到执行上下文或包装器中,并且应该在下一步移动后清除。
class MoveNextReader<T> implements ResourceAwareItemReaderItemStream<T> {
private ResourceAwareItemReaderItemStream delegate;
private boolean skipThisFile = false;
public void setSkipThisFile(boolean value) {
skipThisFile = value;
}
public void setResource(Resource resource) {
skipThisFile = false;
delegate.setResource(resource);
}
public T read() {
if(skipThisFile) {
skipThisFile = false;
// This force MultiResourceItemReader to move to next resource
return null;
}
return delegate.read();
}
}
使用此类作为 MultiResourceItemReader
的委托(delegate),并在 @OnReadError
中注入(inject) MoveNextReader
并设置 MoveNextReader.skipThisFile
。
我无法自己测试代码,但我希望这是一个很好的起点。
关于java - Spring Boot 批处理 - MultiResourceItemReader : move to next file on error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33107103/