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

Annotation of /miscJava/CircuitBreaker/src/main/java/dk/thoerup/circuitbreaker/CircuitBreaker.java

Parent Directory Parent Directory | Revision Log Revision Log


Revision 864 - (hide annotations) (download)
Sun Jun 20 21:54:53 2010 UTC (13 years, 11 months ago) by torben
Original Path: CircuitBreaker/src/dk/thoerup/circuitbreaker/CircuitBreaker.java
File size: 4495 byte(s)
Differentiate against a normal trip and a retrip from half-open back to open
1 torben 467 package dk.thoerup.circuitbreaker;
2 torben 393
3    
4 torben 467 import dk.thoerup.circuitbreaker.notification.Notifier;
5     import dk.thoerup.circuitbreaker.notification.NullNotifier;
6 torben 409
7 torben 394 /* Simple CircuitBreaker implementation - snipped from http://www.jroller.com/kenwdelong/entry/circuit_breaker_in_java
8     *
9     * example of how it can be used
10 torben 395
11     private CircuitBreaker cb = new CircuitBreaker("test", 5, 10000);
12     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
13 torben 393 class TestInvocation implements CircuitInvocation {
14     String url;
15     public TestInvocation(String url) {
16     this.url = url;
17     }
18     public Object proceed() throws Exception{
19    
20     URL u = new URL(url);
21     URLConnection c = u.openConnection();
22     c.connect();
23     InputStream in = c.getInputStream();
24     in.close();
25    
26    
27     return "hello";
28     }
29    
30     }
31     try {
32     String s = (String) cb.invoke(new TestInvocation("http://rafiki/test"));
33     response.getWriter().print(s);
34 torben 452 } catch (Exception e) {
35 torben 393 logger.warning( e.getMessage() );
36     response.sendError(500);
37     return;
38     }
39    
40     }
41     */
42    
43    
44     public class CircuitBreaker{
45    
46 torben 443 private volatile CircuitBreakerState currentState;
47 torben 393
48 torben 424 private final OpenState open = new OpenState();
49     private final HalfOpenState halfOpen = new HalfOpenState();
50     private final ClosedState closed = new ClosedState();
51 torben 393
52     private String name;
53    
54 torben 409 private Notifier notifier = new NullNotifier();
55    
56 torben 393 public CircuitBreaker(String name, int threshold, long timeoutMS) {
57     closed.setThreshold(threshold);
58     open.setTimeout(timeoutMS);
59    
60     this.name = name;
61 torben 625
62 torben 627 //set correct intial state
63     internalReset();
64 torben 393 }
65    
66    
67 torben 450 public Object invoke(CircuitInvocation invocation) throws Exception
68 torben 393 {
69     Object result = null;
70     try
71     {
72     getState().preInvoke(this);
73     result = invocation.proceed();
74     getState().postInvoke(this);
75     }
76 torben 450 catch(Exception e)
77 torben 393 {
78 torben 450 getState().onError(this, e);
79     throw e;
80 torben 393 }
81     return result;
82     }
83    
84     public void tripBreaker() {
85     synchronized(this) {
86 torben 426 if (currentState != open) { // TODO:Is this conditional necessary ??
87     open.trip();
88     currentState = open;
89 torben 393
90 torben 426 notifier.sendNotification(name, Notifier.Event.BreakerTripped);
91     }
92 torben 409 }
93 torben 393 }
94    
95 torben 864 //a re-trip should basically do the same as a normal trip, but it is here just to differentiate the two different events
96     public void retripBreaker() {
97     synchronized(this) {
98     if (currentState != open) { // TODO:Is this conditional necessary ??
99     open.trip();
100     currentState = open;
101    
102     notifier.sendNotification(name, Notifier.Event.BreakerRetripped);
103     }
104     }
105     }
106    
107 torben 393 public void attemptReset() {
108     synchronized(this) {
109 torben 426 if (currentState != halfOpen) { // TODO:Is this conditional necessary ??
110     currentState = halfOpen;
111     notifier.sendNotification(name, Notifier.Event.BreakerAttemptReset);
112     }
113 torben 393 }
114 torben 409
115 torben 393 }
116    
117     public void reset() {
118     synchronized(this) {
119 torben 426 if (currentState != closed) { // TODO: Is this conditional necessary ??
120 torben 627 internalReset();
121 torben 426 notifier.sendNotification(name, Notifier.Event.BreakerReset);
122     }
123 torben 393 }
124     }
125    
126 torben 627 //This one actually sets the correct closed/reset state
127     private void internalReset() {
128     closed.resetFailureCount();
129     currentState = closed;
130     }
131 torben 397
132 torben 627
133 torben 393 private CircuitBreakerState getState() {
134     synchronized(this) {
135     return currentState;
136     }
137     }
138 torben 397
139 torben 447 public boolean isClosed() {
140     return (getState() == closed);
141     }
142    
143     public boolean isOpen() {
144     return (getState() == open);
145     }
146    
147 torben 397 public String getName() {
148     return name;
149     }
150    
151     public String getStateName() {
152     return getState().getName();
153     }
154    
155     public int getThreshold() {
156     return closed.getThreshold();
157     }
158    
159 torben 413 public int getTimeout() {
160     return (int)open.getTimeout();
161     }
162    
163 torben 397 public int getFailureCount() {
164     if (getState() == closed) {
165     return closed.getFailureCount();
166     } else {
167     return -1;
168     }
169     }
170    
171     public long getElapsed() {
172     if (getState() == open) {
173     return open.getElapsed();
174     } else {
175     return -1;
176     }
177     }
178 torben 409
179     public void setNotifier(Notifier notifier) {
180     this.notifier = notifier;
181     }
182    
183     public String getNotifierName() {
184 torben 412 return notifier.getClass().getName();
185 torben 409 }
186 torben 397
187 torben 393 }

Properties

Name Value
svn:mergeinfo

  ViewVC Help
Powered by ViewVC 1.1.20