package dk.thoerup.curcuitbreaker; import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicLong; public class AccountingCircuitBreaker extends CircuitBreaker { private AtomicInteger tripCount = new AtomicInteger(0); // how many times ahs the CB tripped private AtomicInteger blockCount = new AtomicInteger(0); //how many times has this CB blocked a call that would otherwise go to the backend private AtomicInteger totalFailureCount = new AtomicInteger(0); //how many times has the backend thrown an exception private AtomicInteger totalCallCount = new AtomicInteger(0); private AtomicLong lastTrip = new AtomicLong(0); private long lastResetCounters = 0; public AccountingCircuitBreaker(String name, int threshold, long timeoutMS) { super(name, threshold, timeoutMS); resetCounters(); } @Override public Object invoke(CircuitInvocation invocation) throws Exception { Object result; try { totalCallCount.incrementAndGet(); result = super.invoke(invocation); } catch (Exception e) { if (e instanceof CircuitBreakerException) { blockCount.incrementAndGet(); } else { totalFailureCount.incrementAndGet(); } throw e; } return result; } @Override public void tripBreaker() { super.tripBreaker(); tripCount.incrementAndGet(); lastTrip.set( System.currentTimeMillis() ); } public int getTripCount() { return tripCount.get(); } public int getBlockCount() { return blockCount.get(); } public int getTotalFailureCount() { return totalFailureCount.get(); } public long getLastResetCounters() { return lastResetCounters; } public long getLastTrip() { return lastTrip.get(); } public int getTotalCallCount() { return totalCallCount.get(); } public void resetCounters() { tripCount.set(0); blockCount.set(0); totalFailureCount.set(0); totalCallCount.set(0); lastTrip.set(0); lastResetCounters = System.currentTimeMillis(); } }