微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从Hystrix获取异常

如何解决从Hystrix获取异常

我正在将hystrix用于Spring Boot项目,但遇到超时异常。

请在下面找到控制器代码获取详细信息

@GetMapping("/getData")
@HystrixCommand(fallbackMethod = "getDataFallBack",commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "60000"),@HystrixProperty(name = "execution.isolation.strategy",value = "SEMAPHORE") })
public ResponseEntity<Object> getData() {

}

/**
 * Fallback method for getData
 */
public ResponseEntity<Object> getDataFallBack(Throwable e) {
    LOGGER.info("In fallback method",e)
}

虽然在5分钟内测试了更多呼叫(例如1500次匹配),然后获得超时异常。在查看日志时,请在下面找到日志

java.lang.RuntimeException: Could not acquire a semaphore for execution
    at com.netflix.hystrix.AbstractCommand.handleSemaphoreRejectionViaFallback(AbstractCommand.java:966) ~[hystrix-core-1.5.18.jar!/:1.5.18]
    at com.netflix.hystrix.AbstractCommand.applyHystrixSemantics(AbstractCommand.java:554) ~[hystrix-core-1.5.18.jar!/:1.5.18]
    at com.netflix.hystrix.AbstractCommand.access$200(AbstractCommand.java:60) ~[hystrix-core-1.5.18.jar!/:1.5.18]
    at com.netflix.hystrix.AbstractCommand$4.call(AbstractCommand.java:419) ~[hystrix-core-1.5.18.jar!/:1.5.18]
    at com.netflix.hystrix.AbstractCommand$4.call(AbstractCommand.java:413) ~[hystrix-core-1.5.18.jar!/:1.5.18]
    at rx.internal.operators.OnSubscribedefer.call(OnSubscribedefer.java:46) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.internal.operators.OnSubscribedefer.call(OnSubscribedefer.java:35) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.Observable.unsafeSubscribe(Observable.java:10327) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:48) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.internal.operators.OnSubscribeMap.call(OnSubscribeMap.java:33) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.Observable.unsafeSubscribe(Observable.java:10327) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.internal.operators.OnSubscribedoOnEach.call(OnSubscribedoOnEach.java:41) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.internal.operators.OnSubscribedoOnEach.call(OnSubscribedoOnEach.java:30) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48) [rxjava-1.3.8.jar!/:1.3.8]
    at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30) [rxjava-1.3.8.jar!/:1.3.8]

有人可以让我知道如何解决此问题吗?

解决方法

您需要添加hystrix属性execution.isolation.semaphore.maxConcurrentRequests并将其设置为更大的数字(200)。 execution.isolation.semaphore.maxConcurrentRequests的默认值为“ 10”,因此将允许并行执行getData()方法不超过10次。

类似地,您需要添加fallback.isolation.semaphore.maxConcurrentRequests并将其设置为后备方法。

    @GetMapping("/getData")
    @HystrixCommand(fallbackMethod = "getDataFallBack",commandProperties = { @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds",value = "60000"),@HystrixProperty(name = "execution.isolation.strategy",value = "SEMAPHORE"),@HystrixProperty(name = "execution.isolation.semaphore.maxConcurrentRequests",value = "200") })
    public ResponseEntity<Object> getData() {
    
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。