英文:
Own implementation of SkipPolicy interface in spring batch
问题
我尝试给RetryPolicy接口的自定义实现。以下是我的代码。我能够实现canRetry方法,但不确定如何实现open、close和registerThrowable方法。
每当我运行我的代码时,重试会无限次发生。流程进入open方法,返回类型为null。我认为这是导致RetryPlolicy不按预期工作的地方。
@Slf4j
public class RecordRetryPolicy implements RetryPolicy {
public static final int MAX_RETRY_COUNT = 3;
@Override
public boolean canRetry(RetryContext retryContext) {
Throwable t = retryContext.getLastThrowable();
if ((t instanceof BillingException || t instanceof InternalServerException) && retryContext.getRetryCount() <= MAX_RETRY_COUNT) {
log.warn("1st block in canRetry");
return true;
} else if (t instanceof InternalServerException && retryContext.getRetryCount() <= MAX_RETRY_COUNT) {
log.warn("2nd block in canRetry");
return true;
} else {
log.warn("3rd block in canRetry");
return false;
}
}
@Override
public RetryContext open(RetryContext retryContext) {
//return retryContext.getParent();
return null;
}
@Override
public void close(RetryContext retryContext) {
}
@Override
public void registerThrowable(RetryContext retryContext, Throwable throwable) {
}
}
我的步骤定义如下:
@Bean
public Step InfoStep(JpaTransactionManager transactionManager) {
ExponentialBackOffPolicy exponentialBackOffPolicy = new ExponentialBackOffPolicy();
exponentialBackOffPolicy.setInitialInterval(1000);
exponentialBackOffPolicy.setMaxInterval(16000);
exponentialBackOffPolicy.setMultiplier(4.0);
return new StepBuilder("read-step", jobRepository)
.<ShopInfo, ShopInfo>chunk(10, transactionManager)
.reader(dataInfoReader())
.processor(dataInfoProcessor())
.writer(dataInfoWriter())
.taskExecutor(dataTaskExecutor())
.faultTolerant()
.retryPolicy(retryPolicy())
.backOffPolicy(exponentialBackOffPolicy)
.skipPolicy(skipPolicy())
.build();
}
@Bean
public RecordSkipPolicy skipPolicy(){
return new RecordSkipPolicy();
}
@Bean
public RecordRetryPolicy retryPolicy(){
return new RecordRetryPolicy();
}
对于open、close和registerThrowable方法,应该给出什么样的实现?
英文:
I am trying to give own implementation of RetryPolicy interface. Below is my code. I am able to give implementation of canRetry method but not sure about open, close & registerThrowable method. How to give their implementation.
When ever I am running my code the retry happens for infinite number of times. flow goes to open method where return type is null. Which is where i think is causing. So my RetryPlolicy is not working as expected.
@Slf4j
public class RecordRetryPolicy implements RetryPolicy {
public static final int MAX_RETRY_COUNT = 3;
@Override
public boolean canRetry(RetryContext retryContext) {
Throwable t = retryContext.getLastThrowable();
if ((t instanceof BillingException||t instanceof InternalServerException) && retryContext.getRetryCount() <= MAX_RETRY_COUNT) {
log.warn("1st block in canRetry");
return true;
} else if (t instanceof InternalServerException && retryContext.getRetryCount() <= MAX_RETRY_COUNT){
log.warn("2nd block in canRetry");
return true;
} else {
log.warn("3rd block in canRetry");
return false;
}
}
@Override
public RetryContext open(RetryContext retryContext) {
//return retryContext.getParent();
return null;
}
@Override
public void close(RetryContext retryContext) {
}
@Override
public void registerThrowable(RetryContext retryContext, Throwable throwable) {
}
}
My Step is defines as
@Bean
public Step InfoStep(JpaTransactionManager transactionManager) {
ExponentialBackOffPolicy exponentialBackOffPolicy = new ExponentialBackOffPolicy();
exponentialBackOffPolicy.setInitialInterval(1000);
exponentialBackOffPolicy.setMaxInterval(16000);
exponentialBackOffPolicy.setMultiplier(4.0);
return new StepBuilder("read-step", jobRepository)
.<ShopInfo, ShopInfo>chunk(10, transactionManager)
.reader(dataInfoReader())
.processor(dataInfoProcessor())
.writer(dataInfoWriter())
.taskExecutor(dataTaskExecutor())
.faultTolerant()
.retryPolicy(retryPolicy())
.backOffPolicy(exponentialBackOffPolicy)
.skipPolicy(skipPolicy())
.build();
}
@Bean
public RecordSkipPolicy skipPolicy(){
return new RecordSkipPolicy();
}
@Bean
public RecordRetryPolicy retryPolicy(){
return new RecordRetryPolicy();
}
What implementation should be give for open, close & registerThrowable method.
答案1
得分: 1
open
/close
用于获取/释放策略所需的任何资源。registerThrowable
用于在重试上下文中注册异常,以便在后续的重试尝试中决定如何处理。
Spring Retry 提供了多个 RetryPolicy
的实现(请参阅此包),你可以从中获取灵感。
英文:
> not sure about open, close & registerThrowable method. How to give their implementation.
open
/close
are for acquiring/releasing any resources needed by the policy . registerThrowable
is used to register an exception in the retry context so it can be used to decide what to do in the subsequent retry attempt.
Spring Retry provides several implementations of RetryPolicy
(see this package) from which you can get inspiration.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论