Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hystrix断路器.SleepWindowIn毫秒不工作_Java_Spring Boot_Hystrix - Fatal编程技术网

Java Hystrix断路器.SleepWindowIn毫秒不工作

Java Hystrix断路器.SleepWindowIn毫秒不工作,java,spring-boot,hystrix,Java,Spring Boot,Hystrix,我有一个spring引导应用程序,它通过一个hystrix命令和一个回退方法迭代调用一个实例 mockserver配置为始终以状态代码500响应。当在没有断路器的情况下以毫秒运行时,一切正常,调用mockserver,然后调用fallback方法 将Circuit Breaker.SleepWindowInMillissions值配置为5分钟左右后,我希望在5分钟内不会对mockserver进行任何调用,所有调用都会定向到回退方法,但事实并非如此 看起来断路器.SleepWindowInMisc

我有一个spring引导应用程序,它通过一个hystrix命令和一个回退方法迭代调用一个实例

mockserver配置为始终以状态代码500响应。当在没有断路器的情况下以毫秒运行时,一切正常,调用mockserver,然后调用fallback方法

将Circuit Breaker.SleepWindowInMillissions值配置为5分钟左右后,我希望在5分钟内不会对mockserver进行任何调用,所有调用都会定向到回退方法,但事实并非如此

看起来断路器.SleepWindowInMiscells配置被忽略

例如,如果我重新配置mockservice以在迭代仍在运行时使用状态代码200进行回复,它将立即打印“mockservice响应”,而无需等待5分钟

在spring boot主应用程序类中:

@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());