Hystrix命令失败,显示“超时并且没有后备可用”

时间:2014-12-09 09:34:43

标签: java java.util.concurrent hystrix

我注意到我的应用程序中的某些命令失败了

Caused by: ! com.netflix.hystrix.exception.HystrixRuntimeException: GetAPICommand timed-out and no fallback available.
out: ! at com.netflix.hystrix.HystrixCommand.getFallbackOrThrowException(HystrixCommand.java:1631)
out: ! at com.netflix.hystrix.HystrixCommand.access$2000(HystrixCommand.java:97)
out: ! at com.netflix.hystrix.HystrixCommand$TimeoutObservable$1$1.tick(HystrixCommand.java:1025)
out: ! at com.netflix.hystrix.HystrixCommand$1.performBlockingGetWithTimeout(HystrixCommand.java:621)
out: ! at com.netflix.hystrix.HystrixCommand$1.get(HystrixCommand.java:516)
out: ! at com.netflix.hystrix.HystrixCommand.execute(HystrixCommand.java:425)
out: Caused by: ! java.util.concurrent.TimeoutException: null
out: !... 11 common frames omitted

这是我的Hystrix配置覆盖:

hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=210000
hystrix.threadpool.default.coreSize=50
hystrix.threadpool.default.maxQueueSize=100
hystrix.threadpool.default.queueSizeRejectionThreshold=50

这是什么样的超时?它是外部应用程序的读/连接超时吗?我该如何调试呢?

5 个答案:

答案 0 :(得分:27)

这是一个Hystrix命令超时,默认情况下每个命令启用此超时,您可以使用属性定义值:

  

<强> execution.isolation.thread.timeoutInMilliseconds:   此属性设置调用者将在之后的毫秒数   观察超时并离开命令执行。 Hystrix标记&gt; HystrixCommand作为TIMEOUT,执行回退逻辑。

因此,您可以使用属性增加超时值或禁用默认超时(如果适用于您的情况):

@HystrixProperty(name = "hystrix.command.default.execution.timeout.enabled", value = "false")

您可以在此处找到更多信息:https://github.com/Netflix/Hystrix/wiki/Configuration#CommandExecution

答案 1 :(得分:11)

可能是你在调试或你的连接太慢,默认线程执行超时只有1秒,所以你可以轻松地得到这个消息,如果你在命令中设置一个断点让我们说

虽然这不是你的情况,但可能有助于其他人

答案 2 :(得分:1)

查看堆栈跟踪,这是Hystrix在您定义的210秒之后抛出的异常。

因为TimeoutException是一个已检查的异常,需要在每个可能抛出此异常的方法上声明。您会在代码的run()方法中看到此声明。

您可以像调整任何其他程序一样调试此方法,但请注意run()方法在与调用方不同的线程中运行。 210秒后,尽管您的调试会话,调用者仍将继续。

答案 3 :(得分:0)

添加如下依赖后

   <dependency>
        <groupId>com.netflix.hystrix</groupId>
        <artifactId>hystrix-javanica</artifactId>
        <version>1.5.18</version>
    </dependency>

我可以解决超时问题。

您需要做的是在 application.properties 或 bootstrap.properties 中设置 hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=210000 属性

这对我有用,希望能奏效。

答案 4 :(得分:-2)

你应该增加你的休息客户端httpclient readTimeout属性