Java Hystrix断路器.SleepWindowIn毫秒不工作
我有一个spring引导应用程序,它通过一个hystrix命令和一个回退方法迭代调用一个实例 mockserver配置为始终以状态代码500响应。当在没有断路器的情况下以毫秒运行时,一切正常,调用mockserver,然后调用fallback方法 将Circuit Breaker.SleepWindowInMillissions值配置为5分钟左右后,我希望在5分钟内不会对mockserver进行任何调用,所有调用都会定向到回退方法,但事实并非如此 看起来断路器.SleepWindowInMiscells配置被忽略 例如,如果我重新配置mockservice以在迭代仍在运行时使用状态代码200进行回复,它将立即打印“mockservice响应”,而无需等待5分钟 在spring boot主应用程序类中:Java Hystrix断路器.SleepWindowIn毫秒不工作,java,spring-boot,hystrix,Java,Spring Boot,Hystrix,我有一个spring引导应用程序,它通过一个hystrix命令和一个回退方法迭代调用一个实例 mockserver配置为始终以状态代码500响应。当在没有断路器的情况下以毫秒运行时,一切正常,调用mockserver,然后调用fallback方法 将Circuit Breaker.SleepWindowInMillissions值配置为5分钟左右后,我希望在5分钟内不会对mockserver进行任何调用,所有调用都会定向到回退方法,但事实并非如此 看起来断路器.SleepWindowInMisc
@RequestMapping("/iterate")
public void iterate() {
for (int i = 1; i<100; i++ ) {
try {
System.out.println(bookService.readingMockService());
Thread.sleep(3000);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
模拟服务器也在同一台机器上运行,配置如下:
new MockServerClient("127.0.0.1", 1080).reset();
new MockServerClient("127.0.0.1", 1080)
.when(request("/askmock"))
.respond(response()
.withStatusCode(500)
.withBody("mockservice response")
.applyDelay());
从文档中:
通过查看源代码:
使用
@HystrixProperty(name=“hystrix.command.ReadingMockService.circuitBreaker.sleepWindowinmillizes”
应该可以工作。发现问题:
此属性(…circuitBreaker.SleepWindowInMillissions)与另一个属性(…circuitBreaker.requestVolumeThreshold)一起工作。
如果没有特别设置,则默认设置为20,这意味着first hystrix将尝试以通常的方式连接20次,并且只有在之后,SleepWindowInMillics才会被激活,并且只会返回fallback
此外,只有当失败呼叫的百分比超过断路器时,断路器才会断开。errorThresholdPercentage
同时,失败调用的总数超过了circuitBreaker.requestVolumeThreshold,所有调用都在metrics.rollingStats.TimeInMillics的窗口内SleepWindowInMillics:发生{@link HystrixCircuitBreaker}之后的时间(毫秒)trips open表示它应该在再次尝试请求之前等待。当mock返回500时,它会在5分钟内重试吗?不,它实际上会立即重试-这就是我的问题。我希望,确实会在5分钟内重试,但它会继续模拟,而不是使用回退
new MockServerClient("127.0.0.1", 1080).reset();
new MockServerClient("127.0.0.1", 1080)
.when(request("/askmock"))
.respond(response()
.withStatusCode(500)
.withBody("mockservice response")
.applyDelay());