@Recover (резервный метод) не вызывается при использовании с @CircuitBreaker, когда все повторные попытки исчерпаны - PullRequest
0 голосов
/ 17 февраля 2020

Хотя с другим типом возвращаемого значения механизм аварийного возврата Spring работает нормально, но когда дело доходит до вызова API с возвращаемым типом void. Метод восстановления не вызывается вообще, я попытался со всеми возможными типами параметров метода и изменил тип возвращаемого значения резервного метода .... Есть ли какой-нибудь способ сделать это? Я не понимаю, почему у аннотации @CircuitBReaker нет параметра, чтобы принимать имя запасного метода, переданное ему в качестве значения?

    @CircuitBreaker(maxAttempts = 3, openTimeout = 8000, resetTimeout = 15000)
    public Void callingXYZ(final Abc abc, final Cdf cdf) {
        return retryTemplate.execute(context -> {
            log.info("Retry count={} when calling ******", context.getRetryCount());
            AbcServiceImpl.this.update*****Settings(OrgId.fromString(abc.getUUID(), cdf.getData());
            return null;
        });
    }

   //Recover method that should get invoked
    @Recover
    public Void fallbackUpdate*****(Throwable e, Abc abc) throws Throwable{
        log.info("Inside fallback");
        if (e instanceof ClientException) {
            log.warn("Fallback method is called when trying to call ******** from ****** because of {}", e.getCause());

   //Rollback in the db based on the method attributes
            throw SpecificException.forTask(HttpStatus.SERVICE_UNAVAILABLE.value(),
                    Enum.NAME.getErrorCode(),
                    Enum.NAME.getMEssage(), true);
        }
        throw e;
    } 

Ответы [ 2 ]

0 голосов
/ 20 февраля 2020

Я решил проблему в своем коде, это не имело ничего общего с проектом Spring-Retry. Я не смог найти решение своей проблемы из-за недостатка понимания в реализации AOP в Spring. Поскольку аспект Spring применяется к прокси, окружающему bean-компонент, а не к фактическому классу, вызов метода с @circuitbreaker не будет работать, если он вызывается из того же класса / Service.

0 голосов
/ 17 февраля 2020

Попробуйте использовать @Retryable, он работает для меня

 <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
        <version>1.1.5.RELEASE</version>
    </dependency>

@Retryable(value = { NullPointerException.class},maxAttempts = 2)
public void retry() throws NullPointerException{
    throw new NullPointerException("something went wrong");
}

@Recover
public void recover(NullPointerException ex)
{
    System.out.println("iniside recover");
}

Для получения более подробной информации перейдите по этой ссылке https://www.baeldung.com/spring-retry

...