Spring批处理分页阅读器和异常处理

时间:2017-11-03 07:29:23

标签: spring-boot exception-handling pagination spring-batch

我们创建了一个扩展AbstractPaginatedDataItemReader的自定义项目阅读器。 Spring-batch允许管理哪个例外停止或不停止作业(跳过例外)。

在“经典”弹簧批量阅读器中,doRead方法会抛出任何Exception。这意味着,如果在读取过程中抛出了跳过的异常,则跳过该项并继续运行该作业。

但在分页读者中,用于检索下一个数据页的doPageRead方法不会抛出任何异常:

protected abstract Iterator<T> doPageRead();

doPageRead方法调用doRead方法:

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;
        }
    }
}

由于doPageRead方法没有声明任何抛出异常,这意味着配置的跳过异常只能是RuntimeException

由于

1 个答案:

答案 0 :(得分:0)

Spring Batch阅读器最终是std::regex_search (str.cbegin(), str.cend(), match, rgx) ) ~~ ~~ ,无论它是寻呼阅读器还是非寻呼阅读器。这最终意味着它会将单个项目移交给处理器,而ItemReader方法合同就是最重要的。

分页阅读器只是对他们实际阅读项目的方式进行了优化,但与常规的非分页阅读器没有区别。

所以在我看来,你注意read()方法似乎是不必要的,重要的是doReadPage()方法契约。

如果您遇到任何问题(并且您的问题不明确),请告诉我。