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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 426 - (show annotations) (download)
Fri Oct 9 06:45:40 2009 UTC (14 years, 7 months ago) by torben
Original Path: CircuitBreaker/src/dk/thoerup/curcuitbreaker/CircuitBreaker.java
File size: 3823 byte(s)
Synchronisation fixes
1 package dk.thoerup.curcuitbreaker;
2
3 import java.util.logging.Logger;
4
5 import dk.thoerup.curcuitbreaker.notification.Notifier;
6 import dk.thoerup.curcuitbreaker.notification.NullNotifier;
7
8 /* Simple CircuitBreaker implementation - snipped from http://www.jroller.com/kenwdelong/entry/circuit_breaker_in_java
9 *
10 * example of how it can be used
11
12 private CircuitBreaker cb = new CircuitBreaker("test", 5, 10000);
13 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
14 class TestInvocation implements CircuitInvocation {
15 String url;
16 public TestInvocation(String url) {
17 this.url = url;
18 }
19 public Object proceed() throws Exception{
20
21 URL u = new URL(url);
22 URLConnection c = u.openConnection();
23 c.connect();
24 InputStream in = c.getInputStream();
25 in.close();
26
27
28 return "hello";
29 }
30
31 }
32 try {
33 String s = (String) cb.invoke(new TestInvocation("http://rafiki/test"));
34 response.getWriter().print(s);
35 } catch (Throwable e) {
36 logger.warning( e.getMessage() );
37 response.sendError(500);
38 return;
39 }
40
41 }
42 */
43
44
45 public class CircuitBreaker{
46 Logger logger = Logger.getLogger(CircuitBreaker.class.getName());
47
48
49 private CircuitBreakerState currentState;
50
51 private final OpenState open = new OpenState();
52 private final HalfOpenState halfOpen = new HalfOpenState();
53 private final ClosedState closed = new ClosedState();
54
55 private String name;
56
57 private Notifier notifier = new NullNotifier();
58
59 public CircuitBreaker(String name, int threshold, long timeoutMS) {
60 closed.setThreshold(threshold);
61 open.setTimeout(timeoutMS);
62
63 this.name = name;
64
65 reset();
66 }
67
68
69 public Object invoke(CircuitInvocation invocation) throws Throwable
70 {
71 Object result = null;
72 try
73 {
74 getState().preInvoke(this);
75 result = invocation.proceed();
76 getState().postInvoke(this);
77 }
78 catch(Throwable t)
79 {
80 getState().onError(this, t);
81 throw t;
82 }
83 return result;
84 }
85
86 public void tripBreaker() {
87 synchronized(this) {
88 if (currentState != open) { // TODO:Is this conditional necessary ??
89 open.trip();
90 currentState = open;
91
92 notifier.sendNotification(name, Notifier.Event.BreakerTripped);
93 }
94 }
95 }
96
97 public void attemptReset() {
98 synchronized(this) {
99 if (currentState != halfOpen) { // TODO:Is this conditional necessary ??
100 currentState = halfOpen;
101 notifier.sendNotification(name, Notifier.Event.BreakerAttemptReset);
102 }
103 }
104
105 }
106
107 public void reset() {
108 synchronized(this) {
109 if (currentState != closed) { // TODO: Is this conditional necessary ??
110 currentState = closed;
111 notifier.sendNotification(name, Notifier.Event.BreakerReset);
112 }
113 }
114 }
115
116
117 private CircuitBreakerState getState() {
118 synchronized(this) {
119 return currentState;
120 }
121 }
122
123 public String getName() {
124 return name;
125 }
126
127 public String getStateName() {
128 return getState().getName();
129 }
130
131 public int getThreshold() {
132 return closed.getThreshold();
133 }
134
135 public int getTimeout() {
136 return (int)open.getTimeout();
137 }
138
139 public int getFailureCount() {
140 if (getState() == closed) {
141 return closed.getFailureCount();
142 } else {
143 return -1;
144 }
145 }
146
147 public long getElapsed() {
148 if (getState() == open) {
149 return open.getElapsed();
150 } else {
151 return -1;
152 }
153 }
154
155 public void setNotifier(Notifier notifier) {
156 this.notifier = notifier;
157 }
158
159 public String getNotifierName() {
160 return notifier.getClass().getName();
161 }
162
163 }

  ViewVC Help
Powered by ViewVC 1.1.20