--- CircuitBreaker/src/dk/thoerup/circuitbreaker/CircuitBreaker.java 2010/03/08 10:00:55 625 +++ CircuitBreaker/src/dk/thoerup/circuitbreaker/CircuitBreaker.java 2010/10/04 17:36:43 1161 @@ -1,6 +1,9 @@ package dk.thoerup.circuitbreaker; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + import dk.thoerup.circuitbreaker.notification.Notifier; import dk.thoerup.circuitbreaker.notification.NullNotifier; @@ -51,6 +54,7 @@ private String name; + private ExecutorService executor = null; private Notifier notifier = new NullNotifier(); public CircuitBreaker(String name, int threshold, long timeoutMS) { @@ -59,9 +63,14 @@ this.name = name; - // Initial state is open - like a reset() was called initially - closed.resetFailureCount(); - currentState = closed; + //set correct intial state + internalReset(); + } + + public synchronized void shutdown() { + if (executor != null) { + executor.shutdown(); + } } @@ -83,21 +92,30 @@ } public void tripBreaker() { - synchronized(this) { + commonTripBreaker(Notifier.Event.BreakerTripped); + } + + //a re-trip should basically do the same as a normal trip, but it is here just to differentiate the two different events + public void retripBreaker() { + commonTripBreaker(Notifier.Event.BreakerRetripped); + } + + private void commonTripBreaker(Notifier.Event event) { + synchronized(this) { if (currentState != open) { // TODO:Is this conditional necessary ?? open.trip(); currentState = open; - notifier.sendNotification(name, Notifier.Event.BreakerTripped); + notifier.sendNotification(this, event); } - } + } } - + public void attemptReset() { synchronized(this) { if (currentState != halfOpen) { // TODO:Is this conditional necessary ?? currentState = halfOpen; - notifier.sendNotification(name, Notifier.Event.BreakerAttemptReset); + notifier.sendNotification(this, Notifier.Event.BreakerAttemptReset); } } @@ -106,13 +124,18 @@ public void reset() { synchronized(this) { if (currentState != closed) { // TODO: Is this conditional necessary ?? - closed.resetFailureCount(); - currentState = closed; - notifier.sendNotification(name, Notifier.Event.BreakerReset); + internalReset(); + notifier.sendNotification(this, Notifier.Event.BreakerReset); } } } + //This one actually sets the correct closed/reset state + private void internalReset() { + closed.resetFailureCount(); + currentState = closed; + } + private CircuitBreakerState getState() { synchronized(this) { @@ -167,5 +190,15 @@ public String getNotifierName() { return notifier.getClass().getName(); } + + public synchronized ExecutorService getExecutor() { + + if (executor == null) { + executor = Executors.newFixedThreadPool(1); + } + + return executor; + + } }