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

Posted

技术标签:

【中文标题】Spring批量分页阅读器和异常处理【英文标题】:Spring batch paginated reader and Exception handling 【发布时间】:2018-04-15 21:03:53 【问题描述】:

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

在“经典”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】:

Spring Batch 阅读器最终是ItemReader,无论它是分页阅读器还是非分页阅读器。这最终意味着它将把单个项目交给处理器,read() 方法合约才是最重要的。

分页阅读器只是对他们实际阅读项目的方式进行了优化,但与普通的非分页阅读器没有什么不同。

所以在我看来,您对doReadPage() 方法的关注似乎没有必要,重要的是read() 方法合同。

如果您遇到任何问题(从您的问题中不清楚),请告诉我。

【讨论】:

以上是关于Spring批量分页阅读器和异常处理的主要内容,如果未能解决你的问题,请参考以下文章

Java异常总结和Spring事务处理异常机制浅析

如何优雅地处理 Spring Security 中未由 ControllerAdvice 处理的异常?

由于异常回滚后的Spring批量更新数据库状态

处理自定义转换器抛出的 Spring Boot REST 异常

Spring MVC Controller异常处理总结

处理从自定义转换器抛出的Spring Boot REST中的异常