Я сталкиваюсь с ошибкой при добавлении пользовательского BackOffPolicy к повторной попытке весны. Я следовал подходу из Инкрементный линейный откат в Spring Retry .
Мой метод Retryable равен
@Autowired
private RetryOperationsInterceptor retryOperationsInterceptor;
@Override
@Retryable(
interceptor = "retryOperationsInterceptor",
maxAttemptsExpression = "#{${customer.maxRetries:8}}",
value=Exception.class
)
public customer getcustomer(String abc) {
LOGGER.info("Trying to fetch customer details.");
}
@Recover
public customer recover(RuntimeException e, String abc){
LOGGER.info("Recovering - returning safe value");
return null;
}
Мой файл конфигурации
@EnableRetry
public class RetryConfigurations {
@Autowired
private LinearBackoffPolicy linearBackoffPolicy;
@Bean(name = "retryOperationsInterceptor")
RetryOperationsInterceptor retryOperationsInterceptor() {
return RetryInterceptorBuilder.stateless().backOffPolicy(linearBackoffPolicy).build();
}
Я определил простой linearBackOffPolicy как
package com.ncr.digitalbanking.prism.connector.configuration;
import org.springframework.retry.backoff.BackOffInterruptedException;
import org.springframework.retry.backoff.Sleeper;
import org.springframework.retry.backoff.SleepingBackOffPolicy;
import org.springframework.retry.backoff.StatelessBackOffPolicy;
import org.springframework.retry.backoff.ThreadWaitSleeper;
import org.springframework.stereotype.Component;
@Component
public class LinearBackoffPolicy extends StatelessBackOffPolicy implements SleepingBackOffPolicy<LinearBackoffPolicy>{
private static final long DEFAULT_BACK_OFF_PERIOD = 1000L;
private volatile long backOffPeriod = DEFAULT_BACK_OFF_PERIOD;
private volatile long backOffDelta = DEFAULT_BACK_OFF_PERIOD;
private Sleeper sleeper = new ThreadWaitSleeper();
public LinearBackoffPolicy withSleeper(Sleeper sleeper) {
LinearBackoffPolicy linearBackoffPolicy = new LinearBackoffPolicy();
linearBackoffPolicy.setBackOffPeriod(backOffPeriod);
linearBackoffPolicy.setSleeper(sleeper);
return linearBackoffPolicy;
}
public long getBackOffPeriod() {
return backOffPeriod;
}
public void setBackOffPeriod(long backOffPeriod) {
this.backOffPeriod = (backOffPeriod > 0? backOffPeriod : 500);
}
public void setSleeper(Sleeper sleeper) {
this.sleeper = sleeper;
}
protected void doBackOff() throws BackOffInterruptedException {
try {
sleeper.sleep(backOffPeriod);
backOffPeriod = backOffPeriod + backOffDelta;
}
catch (InterruptedException e) {
throw new BackOffInterruptedException("Thread interrupted while sleeping", e);
}
}
public String toString() {
return "LinearBackoffPolicy [backOffPeriod=" + backOffPeriod + "]";
}
}
Проблемы Невозможно использовать линейную политику возврата в вызове rest. Невозможно вызвать метод восстановления после неудачной попытки повторения. Примечание Мой проект работает нормально с этой конфигурацией
@Retryable(
interceptor = "retryOperationsInterceptor",
maxAttemptsExpression = "#{${prism.cas.maxRetries:8}}",
value=Exception.class
backoff = @Backoff(
delayExpression = "#{${prism.cas.delayExpression:10000}}",
multiplier = 2,
maxDelay = 12000
)
)
Я что-то напутал?