Ошибка при добавлении пользовательского BackOffPolicy к Spring-Retry - PullRequest
0 голосов
/ 29 апреля 2020

Я сталкиваюсь с ошибкой при добавлении пользовательского 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
              )
            )

Я что-то напутал?

1 Ответ

0 голосов
/ 29 апреля 2020

@Recover не работает с перехватчиком, настроенным вручную; он работает только тогда, когда фреймворк создает перехватчик.

Вам необходимо добавить .recoverer(...) в ваш конструктор перехватчиков.

Также

    /**
     * Retry interceptor bean name to be applied for retryable method. Is mutually
     * exclusive with other attributes.
     * @return the retry interceptor bean name
     */
    String interceptor() default "";

ваш maxAttemptsExpression игнорируется ; Максимальное количество попыток также должно составлять go на строителе.

...