问题描述
我正在将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() {
}