我正在开发一个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/