如何说 Hystrix 不触发 Hystrix 命令中某些异常的回退
我们通过直接扩展 HystrixCommand 类来使用 Hystrix 功能。但对于一些业务异常,Hystrix的回退方法正在被触发。
我不想为某些特定于业务的异常触发 Hystrix 回退。如何在不基于注释的情况下实现它?
我们通过直接扩展 HystrixCommand 类来使用 Hystrix 功能。但对于一些业务异常,Hystrix的回退方法正在被触发。
我不想为某些特定于业务的异常触发 Hystrix 回退。如何在不基于注释的情况下实现它?
使用忽略异常注释参数
@HystrixCommand(ignoreExceptions = { BaseException.class, MissingServletRequestParameterException.class, TypeMismatchException.class })
查看 https://github.com/Netflix/Hystrix/tree/master/hystrix-contrib/hystrix-javanica#error-propagation
我看到您正在扩展 HystrixCommand 而不是使用注释,但这没关系,只需在命令中设置该属性,它应该具有相同的效果。
不幸的是,Hystrix命令是由Builder模式创建的,因此您将不得不进行一些黑客攻击。忽略异常已添加到DefaultProperties.java,该属性在HystrixCommandBuilder中使用
如果您将逻辑包装在 try/catch 中,并在 HystrixBadRequestException 中重新引发任何异常,那么它不会触发回退。
@Override
protected Object run() throws Exception {
try {
return //call goes here
}
catch (Throwable e) {
//We wrap any exceptions in a HystrixBadRequestException because this way any other errors will not
//trip the short circuit
throw new HystrixBadRequestException("Exception thrown hystrix call", e);
}
}
一个异常,表示提供参数或状态的错误,而不是执行失败。与 HystrixCommand 引发的所有其他异常不同,这不会触发回退,不会计入故障指标,因此不会触发断路器。
注意:仅当错误是由于用户输入(如 IllegalArgumentException)引起的时,才应使用此选项,否则它将破坏容错和回退行为的目的。