Spring Boot 批处理 - MultiResourceItemReader:出错时移至下一个文件 [英] Spring Boot batch - MultiResourceItemReader : move to next file on error
问题描述
在批处理服务中,我使用委托给 StaxEventItemReader 的 MultiResourceItemReader 读取多个 XML 文件.
In a batch service, I read multiple XML files using a MultiResourceItemReader, which delegate to a StaxEventItemReader.
如果在读取文件时出现错误(例如解析异常),我想指定 Spring 开始读取下一个匹配的文件.例如,使用 @OnReadError 注释和/或 SkipPolicy.
If an error is raised reading a file (a parsing exception for example), I would like to specify to Spring to start reading the next matching file. Using @OnReadError annotation and/or a SkipPolicy for example.
当前,当引发读取异常时,批处理停止.
Currently, when a reading exception is raised, the batch stops.
有人知道怎么做吗?
我看到 MultiResourceItemReader 有一个方法 readNextItem(),但它是私有的 -_-
I see MultiResourceItemReader has a method readNextItem(), but it's private -_-
推荐答案
我有一段时间不使用 SB,但在查看 MultiResourceItemReader
代码我想你可以编写自己的 ResourceAwareItemReaderItemStream
包装器,您可以在其中检查设置为移动到下一个文件或使用委托执行标准读取的标志.
此标志可以存储到执行上下文或您的包装器中,并且应该在下一步移动后清除.
I'm not using SB for a while, but looking MultiResourceItemReader
code I suppose you can write your own ResourceAwareItemReaderItemStream
wrapper where you check for a flag setted to move to next file or to perform a standard read using a delegate.
This flag can be stored into execution-context or into your wrapper and should be cleared after a move next.
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
的委托,并在 @OnReadError
注入 MoveNextReader
并设置 MoveNextReader.skipThisFile
.
Use this class as delegate for MultiResourceItemReader
and in @OnReadError
inject MoveNextReader
and set MoveNextReader.skipThisFile
.
我无法自己测试代码,但我希望这是一个好的起点.
I can't test code from myself but I hope this can be a good starting point.
这篇关于Spring Boot 批处理 - MultiResourceItemReader:出错时移至下一个文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!