Hystrix 不抛出 HystrixRuntimeException,而是空消息错误

Posted

技术标签:

【中文标题】Hystrix 不抛出 HystrixRuntimeException,而是空消息错误【英文标题】:Hystrix does not throw HystrixRuntimeException, and instead empty message error 【发布时间】:2018-04-12 16:20:27 【问题描述】:

我在服务层的 spring-boot 应用程序中使用 Hystrix(spring-cloud-dependencies 的 Camden.SR7 版本),没有回退方法。服务的方法之一如下所示:

@HystrixCommand(commandKey = "prefs",
        commandProperties =  @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000"))
@Override
public void savePrefs(PrefsRequestParams requestParams) throws Exception 
    ...

如果此类方法执行时间超过 2 秒,Hystrix 将抛出 java.util.concurrent.TimeoutException: null,REST 响应将如下所示:


    "timestamp": 1509452672714,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "java.util.concurrent.TimeoutException",
    "message": "No message available",
    "path": "/prefs"

对于这样的响应,不清楚实际是从哪个方法抛出异常。如果我将spring-cloud-dependencies 版本更改为 Brixton.SR5(以前的版本),它会返回明确的响应:


    "timestamp": 1509452426819,
    "status": 500,
    "error": "Internal Server Error",
    "exception": "com.netflix.hystrix.exception.HystrixRuntimeException",
    "message": "prefs timed-out and fallback failed.",
    "path": "/prefs"

所以新版Hystrix(其实是新版spring-cloud-dependencies)不会抛出HystrixRuntimeException。这是一个错误还是我应该以其他方式配置 Hystrix 以接收明确的消息错误?

我使用以下 maven 依赖项:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-hystrix</artifactId>
    <version>1.2.7.RELEASE</version>
</dependency>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Camden.SR7</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
     ...

从maven依赖树我看到它使用com.netflix.hystrix:hystrix-core:jar:1.5.6:compile作为spring-cloud-dependencies版本Camden.SR7, 对于版本 Brixton.SR5 - com.netflix.hystrix:hystrix-core:jar:1.5.3:compile

【问题讨论】:

【参考方案1】:

更新到 Javanica 1.5.12 解决了这个问题。

从 1.5.7 开始,还有一个选项可以对所有未被忽略的异常强制抛出 HystrixRuntimeException:

@HystrixCommand(raiseHystrixExceptions = HystrixException.RUNTIME_EXCEPTION)
@Override
public void savePrefs(PrefsRequestParams requestParams) throws Exception 
    ...

【讨论】:

我应该使用哪个版本的 hystrix-javanica?我没有看到 hystrix-javanica-1.5.6 的这种选项 啊对了,先问个版本吧。最新的 1.5.12 版本就有了,不知道什么时候加入的。 它包含在 1.5.7 版本中。 谢谢,升级到1.5.12版后就可以正常使用了。 app 甚至可以在没有 raiseHystrixExceptions 选项的情况下工作。我猜这是 hystrix-javanica 1.5.6 版中的一个错误。请更新/添加您需要使用 1.5.12 版本的答案,我会接受它:) 谢谢,但我不想为此功劳;>。我宁愿删除我的答案,您可以提供自己的答案或只更新问题。

以上是关于Hystrix 不抛出 HystrixRuntimeException,而是空消息错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥设置 DataSource 时 ComboBox 不抛出异常?

为啥 JPA 重复持久方法不抛出异常?

VBScript 上的错误处理:不抛出错误

为啥不抛出异常的代码允许捕获已检查的异常?

回滚而不抛出异常?

System.arraycopy 不抛出 ArrayIndexOutOfBoundsException