Skip to content

Commit 0bad9f5

Browse files
author
Robert Winkler
committed
Fixes ReactiveX#10: Reorders arguments in decorator methods.
1 parent 1d5ca9c commit 0bad9f5

File tree

3 files changed

+180
-14
lines changed

3 files changed

+180
-14
lines changed

gradlew

100644100755
File mode changed.

src/main/java/javaslang/circuitbreaker/CircuitBreaker.java

Lines changed: 166 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,10 @@ interface Metrics {
157157
*
158158
* @param supplier the original supplier
159159
* @param circuitBreaker the CircuitBreaker
160+
*
160161
* @return a supplier which is secured by a CircuitBreaker.
161162
*/
163+
@Deprecated
162164
static <T> Try.CheckedSupplier<T> decorateCheckedSupplier(Try.CheckedSupplier<T> supplier, CircuitBreaker circuitBreaker){
163165
return () -> {
164166
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
@@ -173,13 +175,38 @@ static <T> Try.CheckedSupplier<T> decorateCheckedSupplier(Try.CheckedSupplier<T>
173175
};
174176
}
175177

178+
179+
/**
180+
* Creates a supplier which is secured by a CircuitBreaker.
181+
*
182+
* @param circuitBreaker the CircuitBreaker
183+
* @param supplier the original supplier
184+
*
185+
* @return a supplier which is secured by a CircuitBreaker.
186+
*/
187+
static <T> Try.CheckedSupplier<T> decorateCheckedSupplier(CircuitBreaker circuitBreaker, Try.CheckedSupplier<T> supplier){
188+
return () -> {
189+
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
190+
try {
191+
T returnValue = supplier.get();
192+
circuitBreaker.recordSuccess();
193+
return returnValue;
194+
} catch (Throwable throwable) {
195+
circuitBreaker.recordFailure(throwable);
196+
throw throwable;
197+
}
198+
};
199+
}
200+
176201
/**
177202
* Creates a runnable which is secured by a CircuitBreaker.
178203
*
179204
* @param runnable the original runnable
180205
* @param circuitBreaker the CircuitBreaker
206+
*
181207
* @return a runnable which is secured by a CircuitBreaker.
182208
*/
209+
@Deprecated
183210
static Try.CheckedRunnable decorateCheckedRunnable(Try.CheckedRunnable runnable, CircuitBreaker circuitBreaker){
184211
return () -> {
185212
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
@@ -193,13 +220,36 @@ static Try.CheckedRunnable decorateCheckedRunnable(Try.CheckedRunnable runnable,
193220
};
194221
}
195222

223+
/**
224+
* Creates a runnable which is secured by a CircuitBreaker.
225+
*
226+
* @param circuitBreaker the CircuitBreaker
227+
* @param runnable the original runnable
228+
229+
* @return a runnable which is secured by a CircuitBreaker.
230+
*/
231+
static Try.CheckedRunnable decorateCheckedRunnable(CircuitBreaker circuitBreaker, Try.CheckedRunnable runnable){
232+
return () -> {
233+
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
234+
try{
235+
runnable.run();
236+
circuitBreaker.recordSuccess();
237+
} catch (Throwable throwable){
238+
circuitBreaker.recordFailure(throwable);
239+
throw throwable;
240+
}
241+
};
242+
}
243+
196244
/**
197245
* Creates a supplier which is secured by a CircuitBreaker.
198246
*
199247
* @param supplier the original supplier
200248
* @param circuitBreaker the CircuitBreaker
249+
*
201250
* @return a supplier which is secured by a CircuitBreaker.
202251
*/
252+
@Deprecated
203253
static <T> Supplier<T> decorateSupplier(Supplier<T> supplier, CircuitBreaker circuitBreaker){
204254
return () -> {
205255
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
@@ -214,13 +264,37 @@ static <T> Supplier<T> decorateSupplier(Supplier<T> supplier, CircuitBreaker cir
214264
};
215265
}
216266

267+
/**
268+
* Creates a supplier which is secured by a CircuitBreaker.
269+
*
270+
* @param circuitBreaker the CircuitBreaker
271+
* @param supplier the original supplier
272+
*
273+
* @return a supplier which is secured by a CircuitBreaker.
274+
*/
275+
static <T> Supplier<T> decorateSupplier(CircuitBreaker circuitBreaker, Supplier<T> supplier){
276+
return () -> {
277+
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
278+
try {
279+
T returnValue = supplier.get();
280+
circuitBreaker.recordSuccess();
281+
return returnValue;
282+
} catch (Throwable throwable) {
283+
circuitBreaker.recordFailure(throwable);
284+
throw throwable;
285+
}
286+
};
287+
}
288+
217289
/**
218290
* Creates a consumer which is secured by a CircuitBreaker.
219291
*
220292
* @param consumer the original consumer
221293
* @param circuitBreaker the CircuitBreaker
294+
*
222295
* @return a consumer which is secured by a CircuitBreaker.
223296
*/
297+
@Deprecated
224298
static <T> Consumer<T> decorateConsumer(Consumer<T> consumer, CircuitBreaker circuitBreaker){
225299
return (t) -> {
226300
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
@@ -234,13 +308,36 @@ static <T> Consumer<T> decorateConsumer(Consumer<T> consumer, CircuitBreaker cir
234308
};
235309
}
236310

311+
/**
312+
* Creates a consumer which is secured by a CircuitBreaker.
313+
314+
* @param circuitBreaker the CircuitBreaker
315+
* @param consumer the original consumer
316+
*
317+
* @return a consumer which is secured by a CircuitBreaker.
318+
*/
319+
static <T> Consumer<T> decorateConsumer(CircuitBreaker circuitBreaker, Consumer<T> consumer){
320+
return (t) -> {
321+
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
322+
try {
323+
consumer.accept(t);
324+
circuitBreaker.recordSuccess();
325+
} catch (Throwable throwable) {
326+
circuitBreaker.recordFailure(throwable);
327+
throw throwable;
328+
}
329+
};
330+
}
331+
237332
/**
238333
* Creates a runnable which is secured by a CircuitBreaker.
239334
*
240335
* @param runnable the original runnable
241336
* @param circuitBreaker the CircuitBreaker
337+
*
242338
* @return a runnable which is secured by a CircuitBreaker.
243339
*/
340+
@Deprecated
244341
static Runnable decorateRunnable(Runnable runnable, CircuitBreaker circuitBreaker){
245342
return () -> {
246343
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
@@ -254,13 +351,36 @@ static Runnable decorateRunnable(Runnable runnable, CircuitBreaker circuitBreake
254351
};
255352
}
256353

354+
/**
355+
* Creates a runnable which is secured by a CircuitBreaker.
356+
*
357+
* @param circuitBreaker the CircuitBreaker
358+
* @param runnable the original runnable
359+
*
360+
* @return a runnable which is secured by a CircuitBreaker.
361+
*/
362+
static Runnable decorateRunnable(CircuitBreaker circuitBreaker, Runnable runnable){
363+
return () -> {
364+
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
365+
try{
366+
runnable.run();
367+
circuitBreaker.recordSuccess();
368+
} catch (Throwable throwable){
369+
circuitBreaker.recordFailure(throwable);
370+
throw throwable;
371+
}
372+
};
373+
}
374+
257375
/**
258376
* Creates a function which is secured by a CircuitBreaker.
259377
*
260378
* @param function the original function
261379
* @param circuitBreaker the CircuitBreaker
380+
*
262381
* @return a function which is secured by a CircuitBreaker.
263382
*/
383+
@Deprecated
264384
static <T, R> Function<T, R> decorateFunction(Function<T, R> function, CircuitBreaker circuitBreaker){
265385
return (T t) -> {
266386
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
@@ -275,13 +395,37 @@ static <T, R> Function<T, R> decorateFunction(Function<T, R> function, CircuitBr
275395
};
276396
}
277397

398+
/**
399+
* Creates a function which is secured by a CircuitBreaker.
400+
401+
* @param circuitBreaker the CircuitBreaker
402+
* @param function the original function
403+
*
404+
* @return a function which is secured by a CircuitBreaker.
405+
*/
406+
static <T, R> Function<T, R> decorateFunction(CircuitBreaker circuitBreaker, Function<T, R> function){
407+
return (T t) -> {
408+
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
409+
try{
410+
R returnValue = function.apply(t);
411+
circuitBreaker.recordSuccess();
412+
return returnValue;
413+
} catch (Throwable throwable){
414+
circuitBreaker.recordFailure(throwable);
415+
throw throwable;
416+
}
417+
};
418+
}
419+
278420
/**
279421
* Creates a function which is secured by a CircuitBreaker.
280422
*
281423
* @param function the original function
282424
* @param circuitBreaker the CircuitBreaker
425+
*
283426
* @return a function which is secured by a CircuitBreaker.
284427
*/
428+
@Deprecated
285429
static <T, R> Try.CheckedFunction<T, R> decorateCheckedFunction(Try.CheckedFunction<T, R> function, CircuitBreaker circuitBreaker){
286430
return (T t) -> {
287431
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
@@ -295,4 +439,26 @@ static <T, R> Try.CheckedFunction<T, R> decorateCheckedFunction(Try.CheckedFunct
295439
}
296440
};
297441
}
442+
443+
/**
444+
* Creates a function which is secured by a CircuitBreaker.
445+
*
446+
* @param circuitBreaker the CircuitBreaker
447+
* @param function the original function
448+
*
449+
* @return a function which is secured by a CircuitBreaker.
450+
*/
451+
static <T, R> Try.CheckedFunction<T, R> decorateCheckedFunction(CircuitBreaker circuitBreaker, Try.CheckedFunction<T, R> function){
452+
return (T t) -> {
453+
CircuitBreakerUtils.isCallPermitted(circuitBreaker);
454+
try{
455+
R returnValue = function.apply(t);
456+
circuitBreaker.recordSuccess();
457+
return returnValue;
458+
} catch (Throwable throwable){
459+
circuitBreaker.recordFailure(throwable);
460+
throw throwable;
461+
}
462+
};
463+
}
298464
}

src/test/java/javaslang/circuitbreaker/CircuitBreakerTest.java

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,9 @@ public void shouldReturnFailureWithCircuitBreakerOpenException() {
5757
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.OPEN);
5858

5959
//When
60-
Try.CheckedRunnable checkedRunnable = CircuitBreaker.decorateCheckedRunnable(() -> {
60+
Try.CheckedRunnable checkedRunnable = CircuitBreaker.decorateCheckedRunnable(circuitBreaker, () -> {
6161
throw new RuntimeException("BAM!");
62-
}, circuitBreaker);
62+
});
6363
Try result = Try.run(checkedRunnable);
6464

6565
//Then
@@ -75,9 +75,9 @@ public void shouldReturnFailureWithRuntimeException() {
7575
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED);
7676

7777
//When
78-
Try.CheckedRunnable checkedRunnable = CircuitBreaker.decorateCheckedRunnable(() -> {
78+
Try.CheckedRunnable checkedRunnable = CircuitBreaker.decorateCheckedRunnable(circuitBreaker, () -> {
7979
throw new RuntimeException("BAM!");
80-
}, circuitBreaker);
80+
});
8181
Try result = Try.run(checkedRunnable);
8282

8383
//Then
@@ -106,9 +106,9 @@ public void shouldNotRecordIOExceptionAsAFailure() {
106106
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED);
107107

108108
//When
109-
Try.CheckedRunnable checkedRunnable = CircuitBreaker.decorateCheckedRunnable(() -> {
109+
Try.CheckedRunnable checkedRunnable = CircuitBreaker.decorateCheckedRunnable(circuitBreaker, () -> {
110110
throw new SocketTimeoutException("BAM!");
111-
}, circuitBreaker);
111+
});
112112
Try result = Try.run(checkedRunnable);
113113

114114
//Then
@@ -127,7 +127,7 @@ public void shouldReturnSuccess() {
127127
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.CLOSED);
128128

129129
//When
130-
Supplier<String> checkedSupplier = CircuitBreaker.decorateSupplier(() -> "Hello world", circuitBreaker);
130+
Supplier<String> checkedSupplier = CircuitBreaker.decorateSupplier(circuitBreaker, () -> "Hello world");
131131

132132
//Then
133133
assertThat(checkedSupplier.get()).isEqualTo("Hello world");
@@ -141,9 +141,9 @@ public void shouldInvokeRecoverFunction() {
141141
CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker("testName");
142142

143143
// When I decorate my function and invoke the decorated function
144-
Try.CheckedSupplier<String> checkedSupplier = CircuitBreaker.decorateCheckedSupplier(() -> {
144+
Try.CheckedSupplier<String> checkedSupplier = CircuitBreaker.decorateCheckedSupplier(circuitBreaker, () -> {
145145
throw new RuntimeException("BAM!");
146-
}, circuitBreaker);
146+
});
147147
Try<String> result = Try.of(checkedSupplier)
148148
.recover(throwable -> "Hello Recovery");
149149

@@ -163,7 +163,7 @@ public void shouldInvokeMap() {
163163

164164
// When I decorate my function
165165
Try.CheckedSupplier<String> decoratedSupplier = CircuitBreaker
166-
.decorateCheckedSupplier(() -> "This can be any method which returns: 'Hello", circuitBreaker);
166+
.decorateCheckedSupplier(circuitBreaker, () -> "This can be any method which returns: 'Hello");
167167

168168
// and chain an other function with map
169169
Try<String> result = Try.of(decoratedSupplier)
@@ -197,7 +197,7 @@ public void shouldThrowCircuitBreakerOpenException() {
197197
assertThat(circuitBreaker.getState()).isEqualTo(CircuitBreaker.State.OPEN);
198198

199199
// When I decorate my function and invoke the decorated function
200-
Try<String> result = Try.of(CircuitBreaker.decorateCheckedSupplier(() -> "Hello", circuitBreaker))
200+
Try<String> result = Try.of(CircuitBreaker.decorateCheckedSupplier(circuitBreaker, () -> "Hello"))
201201
.map(value -> value + " world");
202202

203203
// Then the call fails, because CircuitBreaker is OPEN
@@ -217,7 +217,7 @@ public void shouldInvokeAsyncApply() throws ExecutionException, InterruptedExcep
217217

218218
// When
219219
Supplier<String> decoratedSupplier = CircuitBreaker
220-
.decorateSupplier(() -> "This can be any method which returns: 'Hello", circuitBreaker);
220+
.decorateSupplier(circuitBreaker, () -> "This can be any method which returns: 'Hello");
221221

222222
CompletableFuture<String> future = CompletableFuture.supplyAsync(decoratedSupplier)
223223
.thenApply(value -> value + " world'");
@@ -238,10 +238,10 @@ public void shouldChainDecoratedFunctions() throws ExecutionException, Interrupt
238238

239239
// When I create a Supplier and a Function which are decorated by different CircuitBreakers
240240
Try.CheckedSupplier<String> decoratedSupplier = CircuitBreaker
241-
.decorateCheckedSupplier(() -> "Hello", circuitBreaker);
241+
.decorateCheckedSupplier(circuitBreaker, () -> "Hello");
242242

243243
Try.CheckedFunction<String, String> decoratedFunction = CircuitBreaker
244-
.decorateCheckedFunction((input) -> input + " world", anotherCircuitBreaker);
244+
.decorateCheckedFunction(anotherCircuitBreaker, (input) -> input + " world");
245245

246246
// and I chain a function with map
247247
Try<String> result = Try.of(decoratedSupplier)

0 commit comments

Comments
 (0)