如何说 Hystrix 不触发 Hystrix 命令中某些异常的回退

2022-09-03 07:45:04

我们通过直接扩展 HystrixCommand 类来使用 Hystrix 功能。但对于一些业务异常,Hystrix的回退方法正在被触发。

我不想为某些特定于业务的异常触发 Hystrix 回退。如何在不基于注释的情况下实现它?


答案 1

使用忽略异常注释参数

@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中使用


答案 2

如果您将逻辑包装在 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);
    }
}

来自文档:http://netflix.github.io/Hystrix/javadoc/com/netflix/hystrix/exception/HystrixBadRequestException.html

一个异常,表示提供参数或状态的错误,而不是执行失败。与 HystrixCommand 引发的所有其他异常不同,这不会触发回退,不会计入故障指标,因此不会触发断路器。

注意:仅当错误是由于用户输入(如 IllegalArgumentException)引起的时,才应使用此选项,否则它将破坏容错和回退行为的目的。


推荐