@Override protected boolean isCallPermitted() { return circuitBreaker.isCallPermitted(); }
private boolean acquireCallPermit() { boolean callPermitted = false; if (permitted.compareAndSet(Permit.PENDING, Permit.ACQUIRED)) { callPermitted = circuitBreaker.isCallPermitted(); if (!callPermitted) { permitted.set(Permit.REJECTED); } else { stopWatch = StopWatch.start(circuitBreaker.getName()); } } return callPermitted; }
private boolean acquireCallPermit() { boolean callPermitted = false; if (permitted.compareAndSet(Permit.PENDING, Permit.ACQUIRED)) { callPermitted = circuitBreaker.isCallPermitted(); if (!callPermitted) { permitted.set(Permit.REJECTED); } else { stopWatch = StopWatch.start(circuitBreaker.getName()); } } return callPermitted; }
public static void isCallPermitted(CircuitBreaker circuitBreaker) { if(!circuitBreaker.isCallPermitted()) { throw new CircuitBreakerOpenException(String.format("CircuitBreaker '%s' is open", circuitBreaker.getName())); } } }
if (!circuitBreaker.isCallPermitted()) { promise.completeExceptionally( new CircuitBreakerOpenException(
final Future<T> future = Future.future(); if (!circuitBreaker.isCallPermitted()) { future.fail( new CircuitBreakerOpenException(
@Override public Upstream<T> apply(Upstream<? extends T> upstream) throws Exception { return down -> { long start; if (circuitBreaker.isCallPermitted()) { start = System.nanoTime(); upstream.connect(new Downstream<T>() { @Override public void success(T value) { long durationInNanos = System.nanoTime() - start; circuitBreaker.onSuccess(durationInNanos); down.success(value); } @Override public void error(Throwable throwable) { long durationInNanos = System.nanoTime() - start; circuitBreaker.onError(durationInNanos, throwable); handleRecovery(down, throwable); } @Override public void complete() { down.complete(); } }); } else { Throwable t = new CircuitBreakerOpenException(String.format("CircuitBreaker '%s' is open", circuitBreaker.getName())); handleRecovery(down, t); } }; }
} else if (CompletionStage.class.isAssignableFrom(returnType)) { final CompletableFuture promise = new CompletableFuture<>(); if (breaker.isCallPermitted()) { CompletionStage<?> result = (CompletionStage<?>) proceed(invocation, breaker, recoveryFunction); if (result != null) {
@Test public void testCircuitBreakerOpen() throws Exception { boolean exceptionThrown = false; final int threshold = circuitBreaker .getCircuitBreakerConfig() .getRingBufferSizeInClosedState() + 1; setupStub(400); for (int i = 0; i < threshold; i++) { try { testService.greeting(); } catch (final FeignException ex) { // ignore } catch (final CircuitBreakerOpenException ex) { exceptionThrown = true; } } assertThat(exceptionThrown) .describedAs("CircuitBreakerOpenException thrown") .isTrue(); assertThat(circuitBreaker.isCallPermitted()) .describedAs("CircuitBreaker Closed") .isFalse(); }
@Test public void shouldConsumeCallNotPermittedEvent() { circuitBreaker = CircuitBreaker.of("test", CircuitBreakerConfig.custom() .ringBufferSizeInClosedState(1).build()); circuitBreaker.getEventPublisher() .onCallNotPermitted(this::logEventType); circuitBreaker.onError(1000, new IOException("BAM!")); circuitBreaker.onError(1000, new IOException("BAM!")); circuitBreaker.isCallPermitted(); then(logger).should(times(1)).info("NOT_PERMITTED"); }
@Test public void testCircuitBreakerClosed() throws Exception { boolean exceptionThrown = false; final int threshold = circuitBreaker .getCircuitBreakerConfig() .getRingBufferSizeInClosedState() - 1; setupStub(400); for (int i = 0; i < threshold; i++) { try { testService.greeting(); } catch (final FeignException ex) { // ignore } catch (final CircuitBreakerOpenException ex) { exceptionThrown = true; } } assertThat(exceptionThrown) .describedAs("CircuitBreakerOpenException thrown") .isFalse(); assertThat(circuitBreaker.isCallPermitted()) .describedAs("CircuitBreaker Closed") .isTrue(); }
@Test public void shouldNotProduceEventsInDisabledState() { //Given circuitBreaker = CircuitBreaker.of("test", CircuitBreakerConfig.custom() .ringBufferSizeInClosedState(1).build()); circuitBreaker.getEventPublisher() .onEvent(this::logEventType); //When we transition to disabled circuitBreaker.transitionToDisabledState(); //And we execute other calls that should generate events circuitBreaker.onError(1000, new IOException("BAM!")); circuitBreaker.onError(1000, new IOException("BAM!")); circuitBreaker.isCallPermitted(); circuitBreaker.onSuccess(0); circuitBreaker.onError(1000, new IOException("BAM!")); //Then we do not produce events then(logger).should(times(1)).info("STATE_TRANSITION"); then(logger).should(times(0)).info("NOT_PERMITTED"); then(logger).should(times(0)).info("SUCCESS"); then(logger).should(times(0)).info("ERROR"); then(logger).should(times(0)).info("IGNORED_ERROR"); }
circuitBreaker.isCallPermitted(); return circuitBreaker.getState().equals(CircuitBreaker.State.HALF_OPEN); });
assertThat(circuitBreaker.isCallPermitted()).isEqualTo(true); assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED); assertThatMetricsAreReset(); assertThat(circuitBreaker.isCallPermitted()).isEqualTo(true); assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED); assertCircuitBreakerMetricsEqualTo(-1f, null, 1, null, 1, 0L); assertThat(circuitBreaker.isCallPermitted()).isEqualTo(true); assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED); assertCircuitBreakerMetricsEqualTo(-1f, null, 2, null, 2, 0L); assertThat(circuitBreaker.isCallPermitted()).isEqualTo(true); assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED); assertCircuitBreakerMetricsEqualTo(-1f, null, 3, null, 3, 0L); assertThat(circuitBreaker.isCallPermitted()).isEqualTo(true); assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED); assertCircuitBreakerMetricsEqualTo(-1f, null, 4, null, 3, 0L); assertThat(circuitBreaker.isCallPermitted()).isEqualTo(false); // Should create a CircuitBreakerOnCallNotPermittedEvent (7) assertThat(circuitBreaker.isCallPermitted()).isEqualTo(false); // Should create a CircuitBreakerOnCallNotPermittedEvent (8) assertThat(circuitBreaker.isCallPermitted()).isEqualTo(true); assertThat(circuitBreaker.isCallPermitted()).isEqualTo(true); assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.HALF_OPEN); assertCircuitBreakerMetricsEqualTo(-1f, null, 1, null, 1, 0L);
private boolean acquireCallPermit() { boolean callPermitted = false; if (permitted.compareAndSet(Permit.PENDING, Permit.ACQUIRED)) { callPermitted = circuitBreaker.isCallPermitted(); if (!callPermitted) { permitted.set(Permit.REJECTED); } else { stopWatch = StopWatch.start(circuitBreaker.getName()); } } return callPermitted; }
private boolean acquireCallPermit() { boolean callPermitted = false; if (permitted.compareAndSet(Permit.PENDING, Permit.ACQUIRED)) { callPermitted = circuitBreaker.isCallPermitted(); if (!callPermitted) { permitted.set(Permit.REJECTED); } else { stopWatch = StopWatch.start(circuitBreaker.getName()); } } return callPermitted; }
@Override public Upstream<T> apply(Upstream<? extends T> upstream) throws Exception { return down -> { long start; if (circuitBreaker.isCallPermitted()) { start = System.nanoTime(); upstream.connect(new Downstream<T>() { @Override public void success(T value) { long durationInNanos = System.nanoTime() - start; circuitBreaker.onSuccess(durationInNanos); down.success(value); } @Override public void error(Throwable throwable) { long durationInNanos = System.nanoTime() - start; circuitBreaker.onError(durationInNanos, throwable); handleRecovery(down, throwable); } @Override public void complete() { down.complete(); } }); } else { Throwable t = new CircuitBreakerOpenException(String.format("CircuitBreaker '%s' is open", circuitBreaker.getName())); handleRecovery(down, t); } }; }
} else if (CompletionStage.class.isAssignableFrom(returnType)) { final CompletableFuture promise = new CompletableFuture<>(); if (breaker.isCallPermitted()) { CompletionStage<?> result = (CompletionStage<?>) proceed(invocation, breaker, recoveryFunction); if (result != null) {