Я пытаюсь использовать как механизм повтора, так и механизм прерывателя пружины.
Я пытался использовать обе аннотации (@Retryable и @CircuitBreaker) в определенной функции (как показано ниже), но автоматический выключатель не работал.
@Service
public class CommandAndRetry {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleRetryService.class);
@CircuitBreaker(maxAttempts = 1, openTimeout = 10000)
@Retryable(
value = {TypeOneException.class},
maxAttempts = 3, backoff = @Backoff(2000))
public void retryWhenException() throws TypeOneException {
LOGGER.info("Retrying");
throw new TypeOneException();
}
@Recover
public void recover(Throwable t) throws Throwable {
LOGGER.info("SampleRetryService.recover");
throw t;
}
}
Затем я попытался разделить функциональность на две разные функции, обе из которых имели @Retryable и @CircuitBreaker соответственно. В этом случае механизм повтора не работал. Пожалуйста, найдите ниже фрагмент кода.
PS: метод exec (метод прерывателя цепи) вызывается из контроллера.
@Service
public class CommandAndRetry {
private static final Logger LOGGER = LoggerFactory.getLogger(SampleRetryService.class);
@CircuitBreaker(maxAttempts = 1, openTimeout = 10000)
public void exec() throws TypeOneException {
retryWhenException();
}
@Retryable(
value = {TypeOneException.class},
maxAttempts = 3, backoff = @Backoff(2000))
public void retryWhenException() throws TypeOneException {
LOGGER.info("Retrying");
throw new TypeOneException();
}
@Recover
public void recover(Throwable t) throws Throwable {
LOGGER.info("SampleRetryService.recover");
throw t;
}
}
Может кто-нибудь сказать, почему он так себя ведет.
Также, пожалуйста, сообщите, если существует лучший способ реализовать как повтор, так и автоматический выключатель.
PS: я не хочу ни использовать resilience4j, ни retryTemplate.