【发布时间】:2019-02-11 01:51:57
【问题描述】:
我正在尝试利用 spring-retry 的重试和断路器机制。 我尝试在特定函数(如下所示)中同时使用这两个注释(@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。在这种情况下,重试机制不起作用。请在下面找到代码 sn-p。
PS:exec 方法(Circuit Breaker 方法)是从控制器调用的。
@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。 -
是的,但是有什么方法可以配置吗?比如设置Backoff
-
第一个不起作用,因为正如@yegodm 所说,它本身就是
@Retryable- 请参阅我的答案以了解如何做到这一点。
标签: spring spring-retry circuit-breaker