如果写入元素发生异常,如何正确处理 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 步骤编写器异常以便继续处理其他元素?的主要内容,如果未能解决你的问题,请参考以下文章
Spring-Integration Webflux 异常处理
如何在自定义 Spring security 3.0 身份验证中正确处理异常?