gpt4 book ai didi

java - Spring 批处理 : Using SkipPolicy and RetryPolicy with SpringBoot

转载 作者:行者123 更新时间:2023-11-30 05:39:03 27 4
gpt4 key购买 nike

我最近开始学习 Spring Batch 并为一个项目做 POC,我陷入了重试策略和跳过策略。我对这些问题的解决方案有点模糊

问题1):我们可以对一个实例同时使用SkipPolicy和Retry Policy吗?阅读器出现异常,现在框架将查找我们定义的策略。它将同时适用于政策还是我们首先定义的政策……? (我已经在我的 POC 中实现了这一点,但它只会跳过策略,而不会重试策略)我想检查的是,如果异常是 Skippable 的实例,则执行我的业务逻辑,否则如果异常是 Retryable 的实例,则重试特定限制。

问题2):如何获取失败记录的数据,我知道有监听器(ReadListener、WriteListener、ProcessListener),但是,假设重试超过限制,我想记录哪条记录确实导致了该异常。

问题3):有什么方法可以在批量写入数据库或写入某个地方(CSV或平面文件)时获得准确的失败记录

我确实尝试了这些场景,但无法清楚地理解这一点。

任何帮助将不胜感激:)

这是步骤配置

@Bean
public Step step() {
return stepBuilderFactory.get("eventStep")
.<Employee, Employee>chunk(3)
.reader(employeeItemReader())
.listener(stepItemReadListener)
.listener(noWorkFoundStepExecutionListener)
.listener(new StepItemReadListener())
.processor(processor())
.writer(writer())
.faultTolerant()
.skipPolicy(dbConnectivitySkipper)
.retryPolicy(stepRetry)
.listener(stepItemWriteListner)
.build();
}

跳过政策的实现

@Override
public boolean shouldSkip(Throwable exception, int skipCount) throws SkipLimitExceededException {

if (exception instanceof DuplicateKeyException && skipCount <= 5) {
return true;
} else if (exception instanceof NumberFormatException && skipCount <= 5){
return true;
} else {
return false;
}

重试政策的实现

公共(public) boolean canRetry(RetryContext上下文){

    Throwable t = context.getLastThrowable();
if (t instanceof NullPointerException && context.getRetryCount() <= maxAttempts) {
return true;
} else if (t instanceof StepListenerFailedException && context.getRetryCount() <= maxAttempts){
return true;
} else {
return false;
}
}

最佳答案

您的问题中有很多细节,我会尽力提供尽可能多的见解:

问题 1:

重试策略不适用于项目读取器。因此,即使您将异常声明为可重试并且该异常是从读取器抛出的,也不会调用重试策略。这就是为什么您只能看到正在应用的跳过策略。

问题 2

如果超过重试限制,您的作业将会失败。在这种情况下,您可以使用 JobExecution#getAllFailureExceptions 获取最后一个失败异常。最后的失败异常应该告诉您哪个项目导致重试限制耗尽。

问题 3

当编写器中抛出可跳过的异常时,Spring Batch 无法知道哪个项目导致 block 失败。在这种情况下,它将通过一次尝试一个项目来“扫描” block (它实际上会将 block 大小更改为 1 并为每个项目发出一个事务)。因此,只有有问题的项目才会被跳过。通过使用跳过监听器,您可以准确地获取您正在查找的项目。

希望这有帮助。

关于java - Spring 批处理 : Using SkipPolicy and RetryPolicy with SpringBoot,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56045376/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com