下面是我猬命令配置:猬回退方法执行
@HystrixCommand(fallbackMethod = "fall", commandProperties = {
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"),
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000") })
public <T> T getInfo(Class clazz) {....}
回退方法:
public <T> T fall(Class clazz) {
System.out.println("fallback");
throw new CustomRuntimeException("API Down");
}
据我所知,按照下面的配置即
@HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "5"),
@HystrixProperty(name = "metrics.rollingStats.timeInMilliseconds", value = "10000") }
5请求将在10s内允许,直到电路开路并且来自第5个请求的每个请求都将被拒绝d,因为我在后备方法中抛出异常,所以它会被封装为HystrixRuntimeException
。
但我面临以下问题:
- 直到电路跳闸打开后退时被正常执行,但 投掷
CustomRuntimeException
(注:猬命令方法也 抛出CustomRuntimeException
) - 后的电路跳闸开放我越来越
Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: getInfo short-circuited and fallback failed.
问题:
- 为什么电路之前的异常没有包装为HystrixRuntimeException是开放的,即目前的回落是正常执行,直到电路变得开放抛出CustomRuntimeException?*
- 为什么在流程1-> 2-> 3-> 4-> 5-> 6-> 8中,即使在 失败后仍执行回退方法投掷
CustomRuntimeException
)并且不抛出 包裹的HystrixRuntimeException
,这发生在流程 1-> 2-> 3-> 4-> 8并且1-> 2-> 3-> 5-> 8
其实我分别抛出了两个不同的异常:一个在命令方法和另一个在回退方法。从技术上讲,它应该只显示失败的根本原因,即由Command方法引发的异常;但在我的情况下,我只得到了后备抛出的异常。 –
我已经用示例项目的链接更新了答案。在这个例子中,当断路器闭合时,我总是收到主要异常,断路器断开时会收到RuntimeException。 – ahus1
延误道歉。 测试用例与Camden.SR7(hystrix版本1.5.6)一起工作正常,但不在Dalston.SR3(hystrix版本1.5.12)。版本更新后,它正在传播从fallback方法抛出的异常。我认为在隐藏回退异常之后,命令方法的错误传播是一个问题,并且是固定引用:https://github.com/Netflix/Hystrix/issues/332。 –