/** * Returns a builder to create a custom CircuitBreakerConfig. * * @return a {@link Builder} */ public static Builder custom(){ return new Builder(); }
/** * Creates a circuitBreaker with default config. * * @param name the name of the CircuitBreaker */ public CircuitBreakerStateMachine(String name) { this(name, CircuitBreakerConfig.ofDefaults()); }
private Health.Builder addDetails(Health.Builder builder, CircuitBreaker circuitBreaker) { CircuitBreaker.Metrics metrics = circuitBreaker.getMetrics(); CircuitBreakerConfig config = circuitBreaker.getCircuitBreakerConfig(); builder.withDetail(FAILURE_RATE, metrics.getFailureRate() + "%") .withDetail(FAILURE_RATE_THRESHOLD, config.getFailureRateThreshold() + "%") .withDetail(MAX_BUFFERED_CALLS, metrics.getMaxNumberOfBufferedCalls()) .withDetail(BUFFERED_CALLS, metrics.getNumberOfBufferedCalls()) .withDetail(FAILED_CALLS, metrics.getNumberOfFailedCalls()) .withDetail(NOT_PERMITTED, metrics.getNumberOfNotPermittedCalls()); return builder; } }
@Test() public void shouldUseIgnoreExceptionToBuildPredicate() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() .ignoreExceptions(RuntimeException.class, ExtendsExtendsException.class).build(); final Predicate<? super Throwable> failurePredicate = circuitBreakerConfig.getRecordFailurePredicate(); then(failurePredicate.test(new Exception())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsError())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsException())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new ExtendsException2())).isEqualTo(true); // not explicitly excluded then(failurePredicate.test(new RuntimeException())).isEqualTo(false); // explicitly excluded then(failurePredicate.test(new ExtendsRuntimeException())).isEqualTo(false); // inherits excluded from ExtendsException then(failurePredicate.test(new ExtendsExtendsException())).isEqualTo(false); // explicitly excluded }
private io.github.resilience4j.circuitbreaker.CircuitBreaker getOrCreateCircuitBreaker(String methodName, String backend) { io.github.resilience4j.circuitbreaker.CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker(backend, () -> circuitBreakerProperties.createCircuitBreakerConfig(backend)); if (logger.isDebugEnabled()) { logger.debug("Created or retrieved circuit breaker '{}' with failure rate '{}' and wait interval'{}' for method: '{}'", backend, circuitBreaker.getCircuitBreakerConfig().getFailureRateThreshold(), circuitBreaker.getCircuitBreakerConfig().getWaitDurationInOpenState(), methodName); } return circuitBreaker; }
public static void isCallPermitted(CircuitBreaker circuitBreaker) { if(!circuitBreaker.isCallPermitted()) { throw new CircuitBreakerOpenException(String.format("CircuitBreaker '%s' is open", circuitBreaker.getName())); } } }
@Test(expected = IllegalArgumentException.class) public void zeroFailureRateThresholdShouldFail() { CircuitBreakerConfig.custom().failureRateThreshold(0).build(); }
@Test(expected = IllegalArgumentException.class) public void ringBufferSizeInHalfOpenStateBelowOneShouldFail() { CircuitBreakerConfig.custom().ringBufferSizeInHalfOpenState(0).build(); }
@Override protected Throwable getThrowable() { return new CircuitBreakerOpenException( String.format("CircuitBreaker '%s' is open", circuitBreaker.getName())); }
public DecorateRunnable withCircuitBreaker(CircuitBreaker circuitBreaker) { runnable = CircuitBreaker.decorateRunnable(circuitBreaker, runnable); return this; }
public DecorateSupplier<T> withCircuitBreaker(CircuitBreaker circuitBreaker) { supplier = CircuitBreaker.decorateSupplier(circuitBreaker, supplier); return this; }
public DecorateCheckedFunction<T, R> withCircuitBreaker(CircuitBreaker circuitBreaker) { function = CircuitBreaker.decorateCheckedFunction(circuitBreaker, function); return this; }
public DecorateCompletionStage<T> withCircuitBreaker(CircuitBreaker circuitBreaker) { stageSupplier = CircuitBreaker.decorateCompletionStage(circuitBreaker, stageSupplier); return this; }
public DecorateCheckedSupplier<T> withCircuitBreaker(CircuitBreaker circuitBreaker) { supplier = CircuitBreaker.decorateCheckedSupplier(circuitBreaker, supplier); return this; }
public DecorateFunction<T, R> withCircuitBreaker(CircuitBreaker circuitBreaker) { function = CircuitBreaker.decorateFunction(circuitBreaker, function); return this; }
public DecorateCheckedRunnable withCircuitBreaker(CircuitBreaker circuitBreaker) { runnable = CircuitBreaker.decorateCheckedRunnable(circuitBreaker, runnable); return this; }
public DecorateConsumer<T> withCircuitBreaker(CircuitBreaker circuitBreaker) { consumer = CircuitBreaker.decorateConsumer(circuitBreaker, consumer); return this; }
private Health.Builder addDetails(Health.Builder builder, CircuitBreaker circuitBreaker) { CircuitBreaker.Metrics metrics = circuitBreaker.getMetrics(); CircuitBreakerConfig config = circuitBreaker.getCircuitBreakerConfig(); builder.withDetail(FAILURE_RATE, metrics.getFailureRate() + "%") .withDetail(FAILURE_RATE_THRESHOLD, config.getFailureRateThreshold() + "%") .withDetail(MAX_BUFFERED_CALLS, metrics.getMaxNumberOfBufferedCalls()) .withDetail(BUFFERED_CALLS, metrics.getNumberOfBufferedCalls()) .withDetail(FAILED_CALLS, metrics.getNumberOfFailedCalls()) .withDetail(NOT_PERMITTED, metrics.getNumberOfNotPermittedCalls()); return builder; } }
@Test() public void shouldUseRecordExceptionToBuildPredicate() { CircuitBreakerConfig circuitBreakerConfig = CircuitBreakerConfig.custom() .recordExceptions(RuntimeException.class, ExtendsExtendsException.class).build(); final Predicate<? super Throwable> failurePredicate = circuitBreakerConfig.getRecordFailurePredicate(); then(failurePredicate.test(new Exception())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsError())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsException())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new ExtendsException2())).isEqualTo(false); // not explicitly included then(failurePredicate.test(new RuntimeException())).isEqualTo(true); // explicitly included then(failurePredicate.test(new ExtendsRuntimeException())).isEqualTo(true); // inherits included from ExtendsException then(failurePredicate.test(new ExtendsExtendsException())).isEqualTo(true); // explicitly included }