Я пытаюсь использовать как механизм повторной попытки, так и механизм автоматического выключателя повторной попытки. Я попытался использовать обе аннотации (@Retryable и @CircuitBreaker) в конкретной функции (как показано ниже), но Circuit Breaker не работал.
@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.
CircuitBreaker
сам по себеRetryable
. - person yegodm   schedule 06.09.2018@Retryable
- см. Мой ответ о том, как это сделать. - person Gary Russell   schedule 11.09.2018