以下是我的Hystrix命令配置:
@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") }
在10秒内允许5个请求,直到电路开启并且第5个请求的每个请求都将被拒绝,并且因为我在回退方法中抛出异常,它将被包装为HystrixRuntimeException
。
但我面临以下问题:
CustomRuntimeException
(注意:Hystrix Command方法也是如此
抛出CustomRuntimeException
)Caused by: com.netflix.hystrix.exception.HystrixRuntimeException: getInfo short-circuited and fallback failed.
问题:
答案 0 :(得分:2)
请参阅Hystrix Javanica文档以了解异常处理:https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica#error-propagation
引用文档:
&#34;值得注意的是,默认情况下,调用者将始终获得根本原因异常...从不HystrixBadRequestException或HystrixRuntimeException&#34;
&#34;如果命令有后备,则只有第一个触发回退逻辑的异常将传播给调用者。&#34;
这两个引号回答了你的第一个问题:第一个方法的异常将抛出异常,而不是HystrixRuntimeException。永远不会显示回退中抛出的异常。
当断路器打开时,将抛出RuntimeException。同样,后备中抛出的异常将永远不会显示。
附注:
您已将cicruit破坏程序的配置添加到代码中。它们通常更适合弹簧配置,其全名为hystrix.command.default.circuitBreaker.requestVolumeThreshold
。
requestVolumeThreshold的工作方式与您描述的略有不同:它定义了允许cicruit断路器触发之前在时间窗口中所需的最小请求数。 errorThresholdPercentage是一旦达到最小请求数(在您的情况下为5)时允许的错误百分比。在你的情况下,5个呼叫中有5个失败,即100%。 100%大于50%(断路器的默认值),因此它会打开。