public DecorateRunnable withCircuitBreaker(CircuitBreaker circuitBreaker) { runnable = CircuitBreaker.decorateRunnable(circuitBreaker, runnable); return this; }
/** * Decorates and executes the decorated Runnable. * * @param runnable the original Runnable */ default void executeRunnable(Runnable runnable){ decorateRunnable(this, runnable).run(); }
@Test public void shouldDecorateRunnableAndReturnWithSuccess() throws Throwable { // Given CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.ofDefaults(); CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("testName"); CircuitBreaker.Metrics metrics = circuitBreaker.getMetrics(); assertThat(metrics.getNumberOfBufferedCalls()).isEqualTo(0); //When Runnable runnable = CircuitBreaker.decorateRunnable(circuitBreaker, helloWorldService::sayHelloWorld); //Then runnable.run(); assertThat(metrics.getNumberOfBufferedCalls()).isEqualTo(1); assertThat(metrics.getNumberOfFailedCalls()).isEqualTo(0); assertThat(metrics.getNumberOfSuccessfulCalls()).isEqualTo(1); // Then the helloWorldService should be invoked 1 time BDDMockito.then(helloWorldService).should(Mockito.times(1)).sayHelloWorld(); }
@Test public void shouldDecorateRunnableAndReturnWithException() throws Throwable { // Given CircuitBreakerRegistry circuitBreakerRegistry = CircuitBreakerRegistry.ofDefaults(); CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("testName"); CircuitBreaker.Metrics metrics = circuitBreaker.getMetrics(); assertThat(metrics.getNumberOfBufferedCalls()).isEqualTo(0); //When Runnable runnable = CircuitBreaker.decorateRunnable(circuitBreaker, () -> { throw new RuntimeException("BAM!"); }); //Then Try<Void> result = Try.run(runnable::run); assertThat(result.isFailure()).isTrue(); assertThat(result.failed().get()).isInstanceOf(RuntimeException.class); assertThat(metrics.getNumberOfBufferedCalls()).isEqualTo(1); assertThat(metrics.getNumberOfFailedCalls()).isEqualTo(1); assertThat(metrics.getNumberOfSuccessfulCalls()).isEqualTo(0); }
Runnable run = decorateRunnable(circuitBreaker, () -> System.out.println(".")); Runnable fail = decorateRunnable(circuitBreaker, () -> { throw new ConcurrentModificationException(); }); Runnable ignore = decorateRunnable(circuitBreaker, () -> { throw new IllegalArgumentException(); });