Spring boot Spring批处理分页读取器和异常处理

Spring boot Spring批处理分页读取器和异常处理,spring-boot,exception-handling,pagination,spring-batch,Spring Boot,Exception Handling,Pagination,Spring Batch,我们创建了一个自定义项读取器,它扩展了AbstractPaginatedDaitaItemReader。Spring batch允许管理哪些异常停止或不停止作业(跳过的异常) 在“经典”spring批处理读取器中,doRead方法抛出任何异常。这意味着,如果在读取期间引发跳过的异常,则将跳过该项,作业将继续运行 但在分页读卡器中,用于检索下一个数据页的doPageRead方法不会引发任何异常: protected abstract Iterator<T> doPageRead();

我们创建了一个自定义项读取器,它扩展了
AbstractPaginatedDaitaItemReader
。Spring batch允许管理哪些异常停止或不停止作业(跳过的异常)

在“经典”spring批处理读取器中,
doRead
方法抛出任何
异常。这意味着,如果在读取期间引发跳过的异常,则将跳过该项,作业将继续运行

但在分页读卡器中,用于检索下一个数据页的
doPageRead
方法不会引发任何异常:

protected abstract Iterator<T> doPageRead();
由于
doPageRead
方法没有声明任何抛出的异常,这意味着配置的跳过异常只能是
RuntimeException


谢谢

不管是分页阅读器还是非分页阅读器,Spring批处理阅读器最终都是一个
ItemReader
。这最终意味着它将把单个项目移交给处理器,
read()
方法契约才是最重要的

分页阅读器只是对它们实际读取项目的方式进行了优化,但与常规的非分页阅读器没有什么不同

因此,在我看来,您对
doReadPage()
方法的关注似乎没有必要,重要的是
read()
方法契约

如果你面临任何问题(你的问题还不清楚),一定要让我知道

protected T doRead() throws Exception {

    synchronized (lock) {
        if(results == null || !results.hasNext()) {

            results = doPageRead();

            page ++;

            if(results == null || !results.hasNext()) {
                return null;
            }
        }


        if(results.hasNext()) {
            return results.next();
        }
        else {
            return null;
        }
    }
}