Skip to content

Commit 761da88

Browse files
committed
#43 - ENH: Add gitter support to SimpleRetryHandler
1 parent 1a19a1a commit 761da88

File tree

2 files changed

+35
-8
lines changed

2 files changed

+35
-8
lines changed

client/src/main/java/io/avaje/http/client/SimpleRetryHandler.java

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import org.slf4j.LoggerFactory;
55

66
import java.net.http.HttpResponse;
7+
import java.util.Random;
78

89
/**
910
* Simple retry with max attempts and linear backoff.
@@ -14,16 +15,31 @@ public class SimpleRetryHandler implements RetryHandler {
1415

1516
private final int maxRetries;
1617
private final long backoffMillis;
18+
private final int gitterMillis;
19+
private final Random random;
1720

1821
/**
1922
* Create with maximum number of retries and linear backoff time.
2023
*
2124
* @param maxRetries The maximum number of retry attempts
2225
* @param backoffMillis The linear backoff between attempts in milliseconds
26+
* @param gitterMillis The maximum amount of gitter that gets added to backoffMillis
2327
*/
24-
public SimpleRetryHandler(int maxRetries, long backoffMillis) {
28+
public SimpleRetryHandler(int maxRetries, int backoffMillis, int gitterMillis) {
2529
this.maxRetries = maxRetries;
2630
this.backoffMillis = backoffMillis;
31+
this.gitterMillis = gitterMillis;
32+
this.random = new Random();
33+
}
34+
35+
/**
36+
* Create with maximum number of retries and linear backoff time and no gitter.
37+
*
38+
* @param maxRetries The maximum number of retry attempts
39+
* @param backoffMillis The linear backoff between attempts in milliseconds
40+
*/
41+
public SimpleRetryHandler(int maxRetries, int backoffMillis) {
42+
this(maxRetries, backoffMillis, 0);
2743
}
2844

2945
@Override
@@ -33,7 +49,8 @@ public boolean isRetry(int retryCount, HttpResponse<?> response) {
3349
}
3450
log.debug("retry count:{} status:{} uri:{}", retryCount, response.statusCode(), response.uri());
3551
try {
36-
Thread.sleep(backoffMillis);
52+
int gitter = gitterMillis < 1 ? 0 : random.nextInt(gitterMillis);
53+
Thread.sleep(backoffMillis + gitter);
3754
} catch (InterruptedException e) {
3855
Thread.currentThread().interrupt();
3956
return false;

client/src/test/java/io/avaje/http/client/RetryTest.java

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,38 @@
11
package io.avaje.http.client;
22

3-
import com.fasterxml.jackson.databind.ObjectMapper;
43
import org.junit.jupiter.api.Test;
54

65
import java.net.http.HttpResponse;
76

87
import static org.assertj.core.api.Assertions.assertThat;
98

10-
public class RetryTest extends BaseWebTest {
9+
class RetryTest extends BaseWebTest {
1110

12-
final MyIntercept myIntercept = new MyIntercept();
13-
final HttpClientContext clientContext = initClientWithRetry();
1411

15-
HttpClientContext initClientWithRetry() {
12+
HttpClientContext initClientWithRetry(MyIntercept myIntercept, RetryHandler retryHandler) {
1613
return HttpClientContext.newBuilder()
1714
.baseUrl("http://localhost:8887")
1815
.bodyAdapter(new JacksonBodyAdapter())
19-
.retryHandler(new SimpleRetryHandler(4, 1))
16+
.retryHandler(retryHandler)
2017
.requestIntercept(myIntercept)
2118
.build();
2219
}
2320

2421
@Test
2522
void retryTest() {
23+
final MyIntercept myIntercept = new MyIntercept();
24+
final HttpClientContext clientContext = initClientWithRetry(myIntercept, new SimpleRetryHandler(4, 1));
25+
performGetRequestAndAssert(myIntercept, clientContext);
26+
}
27+
28+
@Test
29+
void retryWithGitterTest() {
30+
final MyIntercept myIntercept = new MyIntercept();
31+
final HttpClientContext clientContext = initClientWithRetry(myIntercept, new SimpleRetryHandler(4, 10, 20));
32+
performGetRequestAndAssert(myIntercept, clientContext);
33+
}
34+
35+
private void performGetRequestAndAssert(MyIntercept myIntercept, HttpClientContext clientContext) {
2636
HttpResponse<String> res = clientContext.request()
2737
.label("http_client_hello_retry")
2838
.path("hello/retry")

0 commit comments

Comments
 (0)