如果写入元素发生异常,如何正确处理 Spring Batch 步骤编写器异常以便继续处理其他元素?

Posted

技术标签:

【中文标题】如果写入元素发生异常,如何正确处理 Spring Batch 步骤编写器异常以便继续处理其他元素?【英文标题】:How to correctly handle Spring Batch step writer exception in order to go ahead with other element if an exception occurs writing an element? 【发布时间】:2021-12-10 09:02:01 【问题描述】:

我正在开发一个 Spring Batch 应用程序,我对什么是处理异常的智能方法有以下疑问。按照我的情况:我的工作由一个步骤组成。这一步包含一个编写器组件,它调用外部 API 以便在外部系统上写入当前元素。这是我的作家类代码:

@Component
public class NotaryWriter implements ItemWriter<NotaryDetails> 
    
    //int counter = 1;
    
    @Autowired
    private WpService wpService;

    public NotaryWriter(WpService wpService) 
        super();
        this.wpService = wpService;
    


    @Override
    public void write(List<? extends NotaryDetails> items) throws Exception 
        
        items.stream().forEach(currentNotary -> 
            System.out.println("NotaryWriter - WRITING OUTPUT: " + currentNotary.toString());
            
            try 
                
                //System.out.println("############################################################################# NotaryWriter COUNTER: " + this.counter);

                int newNotaryPostId = this.wpService.insertOrUpdateNotaryAsWpPost(currentNotary);   
                
                //System.out.println("INSERTED or UPDATED NOTARY: " + currentNotary.toString());
                //counter++;
                        
                
             catch (JsonProcessingException | UnsupportedEncodingException | URISyntaxException e) 
                // TODO Auto-generated catch block
                e.printStackTrace();
            
        );
                
    
    

基本上,write() 方法调用 insertOrUpdateNotaryAsWpPost() 服务方法,以便调用外部 REST API 并将当前元素“写入”外部系统。此服务方法可能会返回 catch 中列出的异常。

如果发生这些异常之一并且代码进入此catch,会发生什么情况?元素被跳过(不会写入外部系统,否则我的 Job 会失败?)

如果作业失败,我该如何处理这种情况以便简单地跳过此记录并继续其他记录?

【问题讨论】:

【参考方案1】:

当错误被捕获时,你可以做任何你想做的事情。 默认情况下,只会跳过记录,作业将继续处理元素。

您可以在数据库中写入 ID,可以重试,可以说明在停止之前希望跳过多少次项目等。 行为是高度可配置的,这取决于您的结果。

至于阅读材料,我强烈推荐:

https://www.baeldung.com/spring-batch-skip-logic

https://www.baeldung.com/spring-batch-retry-logic

https://www.javadevjournal.com/spring-batch/spring-batch-listeners/

【讨论】:

以上是关于如果写入元素发生异常,如何正确处理 Spring Batch 步骤编写器异常以便继续处理其他元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何正确地在try / except块中引发异常

Spring-Integration Webflux 异常处理

如何在自定义 Spring security 3.0 身份验证中正确处理异常?

异常处理

处有未经处理的异常:0xC0000005:写入位置0x00EFA000时发生访问冲突.

Spring Batch 事务管理 - 多线程步骤