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

Commit bb6dac1

Browse files
authored
Merge pull request #73 from ipergenitsa/retry-listener-knows-type
PR for CallExecutor does not know the type of a result #72
2 parents dd311a3 + 44ec236 commit bb6dac1

File tree

5 files changed

+89
-22
lines changed

5 files changed

+89
-22
lines changed

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,15 @@ public class AsyncCallExecutor<T> implements RetryExecutor<T, CompletableFuture<
1919

2020
private ExecutorService executorService;
2121

22-
private RetryListener afterFailedTryListener;
22+
private RetryListener<T> afterFailedTryListener;
2323

24-
private RetryListener beforeNextTryListener;
24+
private RetryListener<T> beforeNextTryListener;
2525

26-
private RetryListener onFailureListener;
26+
private RetryListener<T> onFailureListener;
2727

28-
private RetryListener onSuccessListener;
28+
private RetryListener<T> onSuccessListener;
2929

30-
private RetryListener onCompletionListener;
30+
private RetryListener<T> onCompletionListener;
3131

3232
public AsyncCallExecutor(RetryConfig config) {
3333
this(config, null);
@@ -75,27 +75,27 @@ private void executeFuture(Callable<T> callable, String callName, CallExecutor<T
7575
}
7676
}
7777

78-
public AsyncCallExecutor<T> afterFailedTry(RetryListener listener) {
78+
public AsyncCallExecutor<T> afterFailedTry(RetryListener<T> listener) {
7979
this.afterFailedTryListener = listener;
8080
return this;
8181
}
8282

83-
public AsyncCallExecutor<T> beforeNextTry(RetryListener listener) {
83+
public AsyncCallExecutor<T> beforeNextTry(RetryListener<T> listener) {
8484
this.beforeNextTryListener = listener;
8585
return this;
8686
}
8787

88-
public AsyncCallExecutor<T> onCompletion(RetryListener listener) {
88+
public AsyncCallExecutor<T> onCompletion(RetryListener<T> listener) {
8989
this.onCompletionListener = listener;
9090
return this;
9191
}
9292

93-
public AsyncCallExecutor<T> onSuccess(RetryListener listener) {
93+
public AsyncCallExecutor<T> onSuccess(RetryListener<T> listener) {
9494
this.onSuccessListener = listener;
9595
return this;
9696
}
9797

98-
public AsyncCallExecutor<T> onFailure(RetryListener listener) {
98+
public AsyncCallExecutor<T> onFailure(RetryListener<T> listener) {
9999
this.onFailureListener = listener;
100100
return this;
101101
}

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

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,15 @@ public class CallExecutor<T> implements RetryExecutor<T, Status<T>> {
2525

2626
private RetryConfig config;
2727

28-
private RetryListener afterFailedTryListener;
28+
private RetryListener<T> afterFailedTryListener;
2929

30-
private RetryListener beforeNextTryListener;
30+
private RetryListener<T> beforeNextTryListener;
3131

32-
private RetryListener onFailureListener;
32+
private RetryListener<T> onFailureListener;
3333

34-
private RetryListener onSuccessListener;
34+
private RetryListener<T> onSuccessListener;
3535

36-
private RetryListener onCompletionListener;
36+
private RetryListener<T> onCompletionListener;
3737

3838
private Exception lastKnownExceptionThatCausedRetry;
3939

@@ -218,27 +218,27 @@ public void setConfig(RetryConfig config) {
218218
this.config = config;
219219
}
220220

221-
public CallExecutor<T> afterFailedTry(RetryListener listener) {
221+
public CallExecutor<T> afterFailedTry(RetryListener<T> listener) {
222222
this.afterFailedTryListener = listener;
223223
return this;
224224
}
225225

226-
public CallExecutor<T> beforeNextTry(RetryListener listener) {
226+
public CallExecutor<T> beforeNextTry(RetryListener<T> listener) {
227227
this.beforeNextTryListener = listener;
228228
return this;
229229
}
230230

231-
public CallExecutor<T> onCompletion(RetryListener listener) {
231+
public CallExecutor<T> onCompletion(RetryListener<T> listener) {
232232
this.onCompletionListener = listener;
233233
return this;
234234
}
235235

236-
public CallExecutor<T> onSuccess(RetryListener listener) {
236+
public CallExecutor<T> onSuccess(RetryListener<T> listener) {
237237
this.onSuccessListener = listener;
238238
return this;
239239
}
240240

241-
public CallExecutor<T> onFailure(RetryListener listener) {
241+
public CallExecutor<T> onFailure(RetryListener<T> listener) {
242242
this.onFailureListener = listener;
243243
return this;
244244
}

src/main/java/com/evanlennick/retry4j/listener/RetryListener.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
import com.evanlennick.retry4j.Status;
44

5-
public interface RetryListener {
5+
public interface RetryListener<T> {
66

7-
void onEvent(Status status);
7+
void onEvent(Status<T> status);
88

99
}
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package com.evanlennick.retry4j;
2+
3+
import com.evanlennick.retry4j.config.RetryConfig;
4+
import com.evanlennick.retry4j.config.RetryConfigBuilder;
5+
import org.mockito.MockitoAnnotations;
6+
import org.testng.annotations.BeforeMethod;
7+
import org.testng.annotations.Test;
8+
9+
import java.time.temporal.ChronoUnit;
10+
import java.util.ArrayList;
11+
import java.util.List;
12+
import java.util.concurrent.Executors;
13+
14+
import static org.assertj.core.api.Assertions.assertThat;
15+
16+
public class AsyncCallExecutorTest_ListenersTest {
17+
private AsyncCallExecutor<String> executor;
18+
19+
@BeforeMethod
20+
public void setup() {
21+
MockitoAnnotations.initMocks(this);
22+
23+
RetryConfig config = new RetryConfigBuilder()
24+
.retryOnAnyException()
25+
.withMaxNumberOfTries(5)
26+
.withDelayBetweenTries(0, ChronoUnit.SECONDS)
27+
.withFixedBackoff()
28+
.build();
29+
30+
executor = new AsyncCallExecutor<>(config, Executors.newFixedThreadPool(5));
31+
}
32+
33+
@Test
34+
public void verifyOnListener_resultHasTypeOfCallExecutor() throws Exception {
35+
List<String> methodCalls = new ArrayList<>();
36+
executor
37+
.onSuccess(status -> {
38+
methodCalls.add("onSuccess");
39+
assertThat(status.getResult()).isInstanceOf(String.class);
40+
})
41+
.onCompletion(status -> {
42+
methodCalls.add("onCompletion");
43+
assertThat(status.getResult()).isInstanceOf(String.class);
44+
})
45+
.execute(() -> "").get();
46+
assertThat(methodCalls).contains("onSuccess", "onCompletion");
47+
}
48+
}

src/test/java/com/evanlennick/retry4j/CallExecutorTest_ListenersTest.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,11 @@
88
import org.testng.annotations.Test;
99

1010
import java.time.temporal.ChronoUnit;
11+
import java.util.ArrayList;
12+
import java.util.List;
1113
import java.util.concurrent.Callable;
1214

15+
import static org.assertj.core.api.Assertions.assertThat;
1316
import static org.mockito.Mockito.after;
1417
import static org.mockito.Mockito.isA;
1518
import static org.mockito.Mockito.timeout;
@@ -193,6 +196,22 @@ public void verifyOnFailureListener_populatesException() {
193196
verify(dummyMock, timeout(1000)).listenersCallThis(isA(IllegalArgumentException.class));
194197
}
195198

199+
@Test
200+
public void verifyOnListener_resultHasTypeOfCallExecutor() {
201+
List<String> methodCalls = new ArrayList<>();
202+
executor
203+
.onSuccess(status -> {
204+
methodCalls.add("onSuccess");
205+
assertThat(status.getResult()).isInstanceOf(String.class);
206+
})
207+
.onCompletion(status -> {
208+
methodCalls.add("onCompletion");
209+
assertThat(status.getResult()).isInstanceOf(String.class);
210+
})
211+
.execute(() -> "");
212+
assertThat(methodCalls).contains("onSuccess", "onCompletion");
213+
}
214+
196215
private class DummyMock {
197216

198217
public String listenersCallThis() {

0 commit comments

Comments
 (0)