--- CircuitBreaker/src/dk/thoerup/curcuitbreaker/AccountingCircuitBreaker.java 2009/10/06 13:17:41 399 +++ CircuitBreaker/src/dk/thoerup/circuitbreaker/AccountingCircuitBreaker.java 2010/03/08 09:46:10 624 @@ -1,29 +1,41 @@ -package dk.thoerup.curcuitbreaker; +package dk.thoerup.circuitbreaker; 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 failureCount = new AtomicInteger(0); //how many times has the backend thrown an exception + 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 AtomicLong lastFailure = new AtomicLong(0); + private AtomicLong lastReset = 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 Throwable { + public Object invoke(CircuitInvocation invocation) throws Exception { Object result; try { + totalCallCount.incrementAndGet(); result = super.invoke(invocation); - } catch (Throwable t) { - if (t instanceof CircuitBreakerException) { + } catch (Exception e) { + if (e instanceof CircuitBreakerException) { blockCount.incrementAndGet(); } else { - failureCount.incrementAndGet(); + totalFailureCount.incrementAndGet(); + lastFailure.set( System.currentTimeMillis() ); } - throw t; + throw e; } return result; @@ -33,8 +45,17 @@ public void tripBreaker() { super.tripBreaker(); tripCount.incrementAndGet(); + lastTrip.set( System.currentTimeMillis() ); } + + + @Override + public void reset() { + super.reset(); + lastReset.set( System.currentTimeMillis()); + } + public int getTripCount() { return tripCount.get(); } @@ -43,14 +64,40 @@ return blockCount.get(); } - public int getFailureCount() { - return failureCount.get(); + public int getTotalFailureCount() { + return totalFailureCount.get(); + } + + public long getLastResetCounters() { + return lastResetCounters; + } + + public long getLastTrip() { + return lastTrip.get(); + } + + public long getLastFailure() { + return lastFailure.get(); + } + + public long getLastReset() { + return lastReset.get(); + } + + public int getTotalCallCount() { + return totalCallCount.get(); } public void resetCounters() { tripCount.set(0); blockCount.set(0); - failureCount.set(0); + totalFailureCount.set(0); + totalCallCount.set(0); + lastTrip.set(0); + lastReset.set(0); + lastFailure.set(0); + + lastResetCounters = System.currentTimeMillis(); } }