Регистрация неудачной попытки внутри проверенной функции, кажется, считается двойной
Я изучаю 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?
}
Я не смог найти объяснения этому поведению, или, если есть, способ записать сбой для автоматического выключателя в проверенной функции. Кто-нибудь может пролить свет на это?
Ура!
0 ответов
Вам не нужно вызывать onError. Это делается функцией высшего порядка.