1

我正在探索resilience4j,并且希望既能够记录检查函数中断路器的故障,又能够返回有意义的结果。但是当我这样做时,失败似乎被计算为两倍。

我使用的是 0.13.1 版:

<dependency>
    <groupId>io.github.resilience4j</groupId>
    <artifactId>resilience4j-circuitbreaker</artifactId>
    <version>0.13.1</version>
</dependency>

检查以下测试,我们有一个 10 的封闭环形缓冲区,这表明在 CircuitBreaker 可以跳闸之前应该评估 10 个调用。除非在onError检查函数中使用断路器方法记录故障,否则会出现这种情况:

@Test
public void testRecordFailure() {
    CircuitBreakerConfig config = CircuitBreakerConfig.custom()
        .ringBufferSizeInClosedState(10)
        .build();

    CircuitBreakerRegistry registry = CircuitBreakerRegistry.of(config);

    CircuitBreaker breaker1 = registry.circuitBreaker("breaker-1");

    CircuitBreaker breaker2 = registry.circuitBreaker("breaker-2");
    CheckedFunction0<String> supplier2 = CircuitBreaker.decorateCheckedSupplier(breaker2, () -> {
        throw new RuntimeException();
    });

    CircuitBreaker breaker3 = registry.circuitBreaker("breaker-3");
    CheckedFunction0<String> supplier3 = CircuitBreaker.decorateCheckedSupplier(breaker3, () -> {
        breaker3.onError(0, new RuntimeException());
        return "meaningful-result";
    });

    for (int i = 0; i < 4; i++) {
        breaker1.onError(0, new RuntimeException());
        Try.of(supplier2);
        Try.of(supplier3);
    }

    assertEquals(CircuitBreaker.State.CLOSED, breaker1.getState()); // Success
    assertEquals(CircuitBreaker.State.CLOSED, breaker2.getState()); // Success
    assertEquals(CircuitBreaker.State.CLOSED, breaker3.getState()); // Success

    breaker1.onError(0, new RuntimeException());
    Try.of(supplier2);
    Try.of(supplier3);

    assertEquals(CircuitBreaker.State.CLOSED, breaker1.getState()); // Success
    assertEquals(CircuitBreaker.State.CLOSED, breaker2.getState()); // Success
    assertEquals(CircuitBreaker.State.CLOSED, breaker3.getState()); // Failure - circuit is now OPEN - why?
}

我无法找到这种行为的解释,或者是否存在一种方法来记录检查功能内的断路器故障。任何人都可以对此有所了解吗?

干杯!

4

1 回答 1

0

您不必调用 onError。这是由高阶函数完成的。

于 2019-04-11T18:37:53.720 回答