如何正确处理 Spring Batch step writer 异常,以便在写入元素时发生异常时继续处理其他元素?
How to correctly handle Spring Batch step writer exception in order to go ahead with other element if an exception occurs writing an element?
我正在开发 Spring 批处理应用程序,我对处理异常的智能方法有以下疑问。按照我的情况:我的工作是由一个步骤组成的。此单个步骤包含一个编写器组件,该组件调用外部 API 以便在外部系统上写入当前元素。这是我的作者class代码:
@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并在外部系统上“写入”当前元素。此服务方法可能 return 捕获中列出的异常。
如果这些异常之一发生并且代码进入此 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/
我正在开发 Spring 批处理应用程序,我对处理异常的智能方法有以下疑问。按照我的情况:我的工作是由一个步骤组成的。此单个步骤包含一个编写器组件,该组件调用外部 API 以便在外部系统上写入当前元素。这是我的作者class代码:
@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并在外部系统上“写入”当前元素。此服务方法可能 return 捕获中列出的异常。
如果这些异常之一发生并且代码进入此 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/