Skip to content

Commit a8dc202

Browse files
committed
One RetryTemplate be route.
If not, it causes an IllegalArgumentException
1 parent 4cffb2d commit a8dc202

File tree

2 files changed

+19
-17
lines changed

2 files changed

+19
-17
lines changed

spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -53,23 +53,21 @@ public static HandlerFilterFunction<ServerResponse, ServerResponse> retry(Consum
5353
RetryConfig config = new RetryConfig();
5454
configConsumer.accept(config);
5555
RetryTemplateBuilder retryTemplateBuilder = RetryTemplate.builder();
56-
return (request, next) -> {
57-
CompositeRetryPolicy compositeRetryPolicy = new CompositeRetryPolicy();
58-
Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<>();
59-
config.getExceptions().forEach(exception -> retryableExceptions.put(exception, true));
60-
SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(config.getRetries(), retryableExceptions);
61-
compositeRetryPolicy.setPolicies(
62-
Arrays.asList(simpleRetryPolicy, new HttpStatusRetryPolicy(config)).toArray(new RetryPolicy[0]));
63-
RetryTemplate retryTemplate = retryTemplateBuilder.customPolicy(compositeRetryPolicy).build();
64-
return retryTemplate.execute(context -> {
65-
ServerResponse serverResponse = next.handle(request);
66-
67-
if (isRetryableStatusCode(serverResponse.statusCode(), config)) {
68-
throw new HttpServerErrorException(serverResponse.statusCode());
69-
}
70-
return serverResponse;
71-
});
72-
};
56+
CompositeRetryPolicy compositeRetryPolicy = new CompositeRetryPolicy();
57+
Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<>();
58+
config.getExceptions().forEach(exception -> retryableExceptions.put(exception, true));
59+
SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(config.getRetries(), retryableExceptions);
60+
compositeRetryPolicy.setPolicies(
61+
Arrays.asList(simpleRetryPolicy, new HttpStatusRetryPolicy(config)).toArray(new RetryPolicy[0]));
62+
RetryTemplate retryTemplate = retryTemplateBuilder.customPolicy(compositeRetryPolicy).build();
63+
return (request, next) -> retryTemplate.execute(context -> {
64+
ServerResponse serverResponse = next.handle(request);
65+
66+
if (isRetryableStatusCode(serverResponse.statusCode(), config)) {
67+
throw new HttpServerErrorException(serverResponse.statusCode());
68+
}
69+
return serverResponse;
70+
});
7371
}
7472

7573
private static boolean isRetryableStatusCode(HttpStatusCode httpStatus, RetryConfig config) {

spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,10 @@ public void circuitBreakerNoFallbackWorks() {
270270
@Test
271271
public void retryWorks() {
272272
restClient.get().uri("/retry?key=get").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("3");
273+
// test for: java.lang.IllegalArgumentException: You have already selected another
274+
// retry policy
275+
restClient.get().uri("/retry?key=get2").exchange().expectStatus().isOk().expectBody(String.class)
276+
.isEqualTo("3");
273277
}
274278

275279
@Test

0 commit comments

Comments
 (0)