从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() {
    
    }

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...