/[projects]/CircuitBreaker/src/dk/thoerup/circuitbreaker/CircuitBreaker.java
ViewVC logotype

Diff of /CircuitBreaker/src/dk/thoerup/circuitbreaker/CircuitBreaker.java

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

CircuitBreaker/src/dk/thoerup/curcuitbreaker/CircuitBreaker.java revision 443 by torben, Sun Oct 18 07:57:02 2009 UTC CircuitBreaker/src/dk/thoerup/circuitbreaker/CircuitBreaker.java revision 1148 by torben, Fri Oct 1 11:40:30 2010 UTC
# Line 1  Line 1 
1  package dk.thoerup.curcuitbreaker;  package dk.thoerup.circuitbreaker;
2    
3    
4  import dk.thoerup.curcuitbreaker.notification.Notifier;  import java.util.concurrent.ExecutorService;
5  import dk.thoerup.curcuitbreaker.notification.NullNotifier;  import java.util.concurrent.Executors;
6    
7    import dk.thoerup.circuitbreaker.notification.Notifier;
8    import dk.thoerup.circuitbreaker.notification.NullNotifier;
9    
10  /* Simple CircuitBreaker implementation - snipped from http://www.jroller.com/kenwdelong/entry/circuit_breaker_in_java  /* Simple CircuitBreaker implementation - snipped from http://www.jroller.com/kenwdelong/entry/circuit_breaker_in_java
11   *   *
# Line 31  import dk.thoerup.curcuitbreaker.notific Line 34  import dk.thoerup.curcuitbreaker.notific
34                  try {                  try {
35                          String s = (String) cb.invoke(new TestInvocation("http://rafiki/test"));                          String s = (String) cb.invoke(new TestInvocation("http://rafiki/test"));
36                          response.getWriter().print(s);                          response.getWriter().print(s);
37                  } catch (Throwable e) {                  } catch (Exception e) {
38                          logger.warning( e.getMessage() );                          logger.warning( e.getMessage() );
39                          response.sendError(500);                          response.sendError(500);
40                          return;                          return;
# Line 51  public class CircuitBreaker{ Line 54  public class CircuitBreaker{
54                    
55          private String name;          private String name;
56                    
57            private ExecutorService executor = null;        
58          private Notifier notifier = new NullNotifier();          private Notifier notifier = new NullNotifier();
59                    
60          public CircuitBreaker(String name, int threshold, long timeoutMS) {          public CircuitBreaker(String name, int threshold, long timeoutMS) {
# Line 58  public class CircuitBreaker{ Line 62  public class CircuitBreaker{
62                  open.setTimeout(timeoutMS);                  open.setTimeout(timeoutMS);
63                                    
64                  this.name = name;                  this.name = name;
65                            
66                  reset();                  //set correct intial state
67                    internalReset();
68            }
69            
70            public synchronized void shutdown() {
71                    if (executor != null) {
72                            executor.shutdown();
73                    }
74          }          }
75                    
76                    
77      public Object invoke(CircuitInvocation invocation) throws Throwable      public Object invoke(CircuitInvocation invocation) throws Exception
78      {      {
79          Object result = null;          Object result = null;
80          try          try
# Line 72  public class CircuitBreaker{ Line 83  public class CircuitBreaker{
83              result = invocation.proceed();              result = invocation.proceed();
84              getState().postInvoke(this);              getState().postInvoke(this);
85          }          }
86          catch(Throwable t)          catch(Exception e)
87          {          {
88              getState().onError(this, t);              getState().onError(this, e);
89              throw t;              throw e;
90          }          }
91          return result;          return result;
92      }      }
93            
94      public void tripBreaker() {      public void tripBreaker() {
95          synchronized(this) {          commonTripBreaker(Notifier.Event.BreakerTripped);
96        }
97        
98            //a re-trip should basically do the same as a normal trip, but it is here just to differentiate the two different events
99        public void retripBreaker() {
100            commonTripBreaker(Notifier.Event.BreakerRetripped);
101        }
102        
103        private void commonTripBreaker(Notifier.Event event) {
104            synchronized(this) {
105                  if (currentState != open) { // TODO:Is this conditional necessary ??                  if (currentState != open) { // TODO:Is this conditional necessary ??
106                          open.trip();                          open.trip();
107                          currentState = open;                          currentState = open;
108                                    
109                          notifier.sendNotification(name, Notifier.Event.BreakerTripped);                          notifier.sendNotification(name, event);
110                  }                  }
111          }              }      
112      }      }
113        
114      public void attemptReset() {      public void attemptReset() {
115          synchronized(this) {          synchronized(this) {
116                  if (currentState != halfOpen) { // TODO:Is this conditional necessary ??                  if (currentState != halfOpen) { // TODO:Is this conditional necessary ??
# Line 104  public class CircuitBreaker{ Line 124  public class CircuitBreaker{
124      public void reset() {      public void reset() {
125          synchronized(this) {          synchronized(this) {
126                  if (currentState != closed) { // TODO: Is this conditional necessary ??                  if (currentState != closed) { // TODO: Is this conditional necessary ??
127                          currentState = closed;                          internalReset();
128                          notifier.sendNotification(name, Notifier.Event.BreakerReset);                          notifier.sendNotification(name, Notifier.Event.BreakerReset);
129                  }                  }
130          }          }
131      }      }
132            
133        //This one actually sets the correct closed/reset state
134        private void internalReset() {
135                    closed.resetFailureCount();
136                    currentState = closed;          
137        }
138        
139            
140      private CircuitBreakerState getState() {      private CircuitBreakerState getState() {
141          synchronized(this) {          synchronized(this) {
# Line 117  public class CircuitBreaker{ Line 143  public class CircuitBreaker{
143          }          }
144      }      }
145            
146        public boolean isClosed() {
147            return (getState() == closed);
148        }
149        
150        public boolean isOpen() {
151            return (getState() == open);
152        }
153        
154      public String getName() {      public String getName() {
155          return name;          return name;
156      }      }
# Line 156  public class CircuitBreaker{ Line 190  public class CircuitBreaker{
190      public String getNotifierName() {      public String getNotifierName() {
191          return notifier.getClass().getName();          return notifier.getClass().getName();
192      }      }
193        
194        public synchronized ExecutorService getExecutor() {
195            
196            if (executor == null) {
197                    executor = Executors.newFixedThreadPool(1);
198            }
199            
200            return executor;
201            
202        }
203    
204  }  }

Legend:
Removed from v.443  
changed lines
  Added in v.1148

  ViewVC Help
Powered by ViewVC 1.1.20