Skip to content
This repository was archived by the owner on Jun 21, 2023. It is now read-only.

Commit d0635b3

Browse files
authored
Merge pull request #75 from raghavan20/immutable-retryconfig
CallExecutor to use immutable RetryConfig
2 parents 0eb3409 + fe5be0c commit d0635b3

18 files changed

+464
-303
lines changed

README.md

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -326,10 +326,10 @@ new RetryConfigBuilder()
326326
327327
### CallExecutor
328328
329-
Executing your code with retry logic is as simple as instantiating a **CallExecutor** with your configuration and then calling execute:
329+
Executing your code with retry logic is as simple as building a **CallExecutor** using **CallExecutorBuilder** with your configuration and then calling execute:
330330
331331
```java
332-
new CallExecutor(config).execute(callable);
332+
new CallExecutorBuilder.config(config).build().execute(callable);
333333
```
334334
335335
The CallExecutor expects that your logic is wrapped in a **java.util.concurrent.Callable**.
@@ -426,12 +426,14 @@ executor.onCompletion(s -> {
426426
Listeners can be chained together:
427427

428428
```java
429-
new CallExecutor<>(config)
429+
new CallExecutorBuilder<>()
430+
.config(config)
430431
.onSuccess(s -> System.out.println("Success!"))
431432
.onCompletion(s -> System.out.println("Retry execution complete!"))
432433
.onFailure(s -> System.out.println("Failed! All retries exhausted..."))
433434
.afterFailedTry(s -> System.out.println("Try failed! Will try again in 0ms."))
434435
.beforeNextTry(s -> System.out.println("Trying again..."))
436+
.build()
435437
.execute(callable);
436438
```
437439

@@ -442,7 +444,7 @@ Retry4j has some built in support for executing and retrying on one or more thre
442444
in action with a single call:
443445
444446
```java
445-
AsyncCallExecutor<Boolean> executor = new AsyncCallExecutor<>(config);
447+
AsyncCallExecutor<Boolean> executor = new CallExecutorBuilder().config(config).buildAsync();
446448
CompletableFuture<Status<Boolean>> future = executor.execute(callable);
447449
Status<Boolean> status = future.get();
448450
```
@@ -454,7 +456,7 @@ execution will not be blocked until `future.get()` is called (if it hasn't compl
454456
This executor can also be used to trigger several Callable's in parallel:
455457
456458
```java
457-
AsyncCallExecutor<Boolean> executor = new AsyncCallExecutor<>(retryOnAnyExceptionConfig);
459+
AsyncCallExecutor<Boolean> executor = new CallExecutorBuilder().config(retryOnAnyExceptionConfig).buildAsync();
458460
459461
CompletableFuture<Status<Boolean>> future1 = executor.execute(callable1);
460462
CompletableFuture<Status<Boolean>> future2 = executor.execute(callable2);
@@ -470,7 +472,7 @@ up.
470472

471473
```java
472474
ExecutorService executorService = Executors.newFixedThreadPool(10);
473-
new AsyncCallExecutor<>(config, executorService);
475+
new CallExecutorBuilder().config(config).buildAsync(executorService);
474476
```
475477

476478
You can register retry listeners and configuration on an `AsyncCallExecutor` in the same fashion as the normal,

src/main/java/com/evanlennick/retry4j/AsyncCallExecutor.java

Lines changed: 25 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,19 @@ public class AsyncCallExecutor<T> implements RetryExecutor<T, CompletableFuture<
2929

3030
private RetryListener<T> onCompletionListener;
3131

32-
public AsyncCallExecutor(RetryConfig config) {
33-
this(config, null);
34-
}
35-
36-
public AsyncCallExecutor(RetryConfig config, ExecutorService executorService) {
32+
/**
33+
* Use {@link CallExecutorBuilder} to build AsyncCallExecutor
34+
*/
35+
AsyncCallExecutor(RetryConfig config, ExecutorService executorService, RetryListener<T> afterFailedTryListener,
36+
RetryListener<T> beforeNextTryListener, RetryListener<T> onFailureListener,
37+
RetryListener<T> onSuccessListener, RetryListener<T> onCompletionListener) {
3738
this.config = config;
3839
this.executorService = executorService;
40+
this.afterFailedTryListener = afterFailedTryListener;
41+
this.beforeNextTryListener = beforeNextTryListener;
42+
this.onFailureListener = onFailureListener;
43+
this.onSuccessListener = onSuccessListener;
44+
this.onCompletionListener = onCompletionListener;
3945
}
4046

4147
@Override
@@ -45,13 +51,8 @@ public CompletableFuture<Status<T>> execute(Callable<T> callable) {
4551

4652
@Override
4753
public CompletableFuture<Status<T>> execute(Callable<T> callable, String callName) {
48-
CallExecutor<T> synchronousCallExecutor = new CallExecutor<>(config);
49-
50-
synchronousCallExecutor.afterFailedTry(afterFailedTryListener);
51-
synchronousCallExecutor.beforeNextTry(beforeNextTryListener);
52-
synchronousCallExecutor.onSuccess(onSuccessListener);
53-
synchronousCallExecutor.onFailure(onFailureListener);
54-
synchronousCallExecutor.onCompletion(onCompletionListener);
54+
CallExecutor<T> synchronousCallExecutor = new CallExecutor<>(config, afterFailedTryListener,
55+
beforeNextTryListener, onFailureListener, onSuccessListener, onCompletionListener);
5556

5657
CompletableFuture<Status<T>> completableFuture = new CompletableFuture<>();
5758

@@ -75,34 +76,28 @@ private void executeFuture(Callable<T> callable, String callName, CallExecutor<T
7576
}
7677
}
7778

78-
public AsyncCallExecutor<T> afterFailedTry(RetryListener<T> listener) {
79-
this.afterFailedTryListener = listener;
80-
return this;
79+
public RetryConfig getConfig() {
80+
return config;
8181
}
8282

83-
public AsyncCallExecutor<T> beforeNextTry(RetryListener<T> listener) {
84-
this.beforeNextTryListener = listener;
85-
return this;
83+
public RetryListener<T> getAfterFailedTryListener() {
84+
return afterFailedTryListener;
8685
}
8786

88-
public AsyncCallExecutor<T> onCompletion(RetryListener<T> listener) {
89-
this.onCompletionListener = listener;
90-
return this;
87+
public RetryListener<T> getBeforeNextTryListener() {
88+
return beforeNextTryListener;
9189
}
9290

93-
public AsyncCallExecutor<T> onSuccess(RetryListener<T> listener) {
94-
this.onSuccessListener = listener;
95-
return this;
91+
public RetryListener<T> getOnFailureListener() {
92+
return onFailureListener;
9693
}
9794

98-
public AsyncCallExecutor<T> onFailure(RetryListener<T> listener) {
99-
this.onFailureListener = listener;
100-
return this;
95+
public RetryListener<T> getOnSuccessListener() {
96+
return onSuccessListener;
10197
}
10298

103-
@Override
104-
public void setConfig(RetryConfig config) {
105-
this.config = config;
99+
public RetryListener<T> getOnCompletionListener() {
100+
return onCompletionListener;
106101
}
107102

108103
public void setExecutorService(ExecutorService executorService) {

src/main/java/com/evanlennick/retry4j/CallExecutor.java

Lines changed: 23 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -39,12 +39,18 @@ public class CallExecutor<T> implements RetryExecutor<T, Status<T>> {
3939

4040
private Status<T> status = new Status<>();
4141

42-
public CallExecutor() {
43-
this(new RetryConfigBuilder().fixedBackoff5Tries10Sec().build());
44-
}
45-
46-
public CallExecutor(RetryConfig config) {
42+
/**
43+
* Use {@link CallExecutorBuilder} to build {@link CallExecutor}
44+
*/
45+
CallExecutor(RetryConfig config, RetryListener<T> afterFailedTryListener,
46+
RetryListener<T> beforeNextTryListener, RetryListener<T> onFailureListener,
47+
RetryListener<T> onSuccessListener, RetryListener<T> onCompletionListener) {
4748
this.config = config;
49+
this.afterFailedTryListener = afterFailedTryListener;
50+
this.beforeNextTryListener = beforeNextTryListener;
51+
this.onFailureListener = onFailureListener;
52+
this.onSuccessListener = onSuccessListener;
53+
this.onCompletionListener = onCompletionListener;
4854
this.status.setId(UUID.randomUUID().toString());
4955
}
5056

@@ -232,36 +238,28 @@ private Set<Class<?>> getExceptionCauses(Exception exception) {
232238
}
233239
return causes;
234240
}
235-
236-
@Override
237-
public void setConfig(RetryConfig config) {
238-
logger.trace("Set config on retry4j executor {}", config);
239-
this.config = config;
241+
public RetryConfig getConfig() {
242+
return config;
240243
}
241244

242-
public CallExecutor<T> afterFailedTry(RetryListener<T> listener) {
243-
this.afterFailedTryListener = listener;
244-
return this;
245+
public RetryListener<T> getAfterFailedTryListener() {
246+
return afterFailedTryListener;
245247
}
246248

247-
public CallExecutor<T> beforeNextTry(RetryListener<T> listener) {
248-
this.beforeNextTryListener = listener;
249-
return this;
249+
public RetryListener<T> getBeforeNextTryListener() {
250+
return beforeNextTryListener;
250251
}
251252

252-
public CallExecutor<T> onCompletion(RetryListener<T> listener) {
253-
this.onCompletionListener = listener;
254-
return this;
253+
public RetryListener<T> getOnFailureListener() {
254+
return onFailureListener;
255255
}
256256

257-
public CallExecutor<T> onSuccess(RetryListener<T> listener) {
258-
this.onSuccessListener = listener;
259-
return this;
257+
public RetryListener<T> getOnSuccessListener() {
258+
return onSuccessListener;
260259
}
261260

262-
public CallExecutor<T> onFailure(RetryListener<T> listener) {
263-
this.onFailureListener = listener;
264-
return this;
261+
public RetryListener<T> getOnCompletionListener() {
262+
return onCompletionListener;
265263
}
266264

267265
@Override
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
package com.evanlennick.retry4j;
2+
3+
import com.evanlennick.retry4j.config.RetryConfig;
4+
import com.evanlennick.retry4j.config.RetryConfigBuilder;
5+
import com.evanlennick.retry4j.listener.RetryListener;
6+
7+
import java.util.concurrent.ExecutorService;
8+
9+
public class CallExecutorBuilder<T> {
10+
11+
public static final RetryConfig DEFAULT_RETRY_CONFIG = new RetryConfigBuilder().fixedBackoff5Tries10Sec().build();
12+
private RetryConfig retryConfig = DEFAULT_RETRY_CONFIG;
13+
private RetryListener afterFailedTryListener;
14+
private RetryListener beforeNextTryListener;
15+
private RetryListener onSuccessListener;
16+
private RetryListener onFailureListener;
17+
private RetryListener onCompletionListener;
18+
19+
public CallExecutorBuilder() {
20+
}
21+
22+
public CallExecutorBuilder config(RetryConfig retryConfig) {
23+
this.retryConfig = retryConfig;
24+
return this;
25+
}
26+
27+
public CallExecutorBuilder onCompletionListener(RetryListener listener) {
28+
this.onCompletionListener = listener;
29+
return this;
30+
}
31+
32+
public CallExecutorBuilder onSuccessListener(RetryListener listener) {
33+
this.onSuccessListener = listener;
34+
return this;
35+
}
36+
37+
public CallExecutorBuilder onFailureListener(RetryListener listener) {
38+
this.onFailureListener = listener;
39+
return this;
40+
}
41+
42+
public CallExecutorBuilder beforeNextTryListener(RetryListener listener) {
43+
this.beforeNextTryListener = listener;
44+
return this;
45+
}
46+
47+
public CallExecutorBuilder afterFailedTryListener(RetryListener listener) {
48+
this.afterFailedTryListener = listener;
49+
return this;
50+
}
51+
52+
public CallExecutor<T> build() {
53+
return new CallExecutor(retryConfig, afterFailedTryListener, beforeNextTryListener,
54+
onFailureListener, onSuccessListener, onCompletionListener);
55+
}
56+
57+
public AsyncCallExecutor<T> buildAsync() {
58+
return new AsyncCallExecutor(retryConfig, null, afterFailedTryListener, beforeNextTryListener,
59+
onFailureListener, onSuccessListener, onCompletionListener);
60+
}
61+
62+
public AsyncCallExecutor<T> buildAsync(ExecutorService executorService) {
63+
return new AsyncCallExecutor(retryConfig, executorService, afterFailedTryListener, beforeNextTryListener,
64+
onFailureListener, onSuccessListener, onCompletionListener);
65+
}
66+
}

src/main/java/com/evanlennick/retry4j/RetryExecutor.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,4 @@ public interface RetryExecutor<T, S> {
1212

1313
S execute(Callable<T> callable, String callName) throws RetriesExhaustedException, UnexpectedException;
1414

15-
void setConfig(RetryConfig config);
16-
1715
}

0 commit comments

Comments
 (0)