如何正确处理春季批处理步骤写入器异常,以便继续与其他元素,如果发生异常写一个元素?



我正在开发一个Spring批处理应用程序,我对处理异常的聪明方法有以下疑问。根据我的情况:我的工作是由一个步骤组成的。这个步骤包含一个writer组件,该组件调用外部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将失败?)

在工作失败的情况下,我如何处理这种情况,以便简单地跳过这个记录,继续进行其他记录?

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

你可以在数据库中写入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/

相关内容

  • 没有找到相关文章

最新更新