Регистрация неудачной попытки внутри проверенной функции, кажется, считается двойной - PullRequest
0 голосов
/ 03 января 2019

Я изучаю resilience4j и хотел бы иметь возможность записать сбой выключателя внутри проверяемой функции, а также вернуть значимый результат.Но неудача, кажется, засчитывается вдвое больше, чем я.

Я использую версию 0.13.1:

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

Проверьте следующий тест, у нас есть закрытый кольцевой буфер 10, который указывает, что 10 вызовов должны быть оценены до того, как CircuitBreaker может бытьсработал.Это относится к случаю, за исключением случаев, когда записывается сбой с помощью метода автоматического выключателя 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?
}

Мне не удалось найти объяснение этому поведению или если оно существуетспособ записать сбой для автоматического выключателя внутри проверенной функции.Кто-нибудь может пролить свет на это?

Ура!

1 Ответ

0 голосов
/ 11 апреля 2019

Вам не нужно вызывать onError.Это делается функцией высшего порядка.

...