Browse Source

One RetryTemplate be route.

If not, it causes an IllegalArgumentException
pull/2745/merge
sgibb 1 year ago
parent
commit
a8dc202edf
No known key found for this signature in database
GPG Key ID: 7788A47380690861
  1. 32
      spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java
  2. 4
      spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java

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

@ -53,23 +53,21 @@ public abstract class RetryFilterFunctions { @@ -53,23 +53,21 @@ public abstract class RetryFilterFunctions {
RetryConfig config = new RetryConfig();
configConsumer.accept(config);
RetryTemplateBuilder retryTemplateBuilder = RetryTemplate.builder();
return (request, next) -> {
CompositeRetryPolicy compositeRetryPolicy = new CompositeRetryPolicy();
Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<>();
config.getExceptions().forEach(exception -> retryableExceptions.put(exception, true));
SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(config.getRetries(), retryableExceptions);
compositeRetryPolicy.setPolicies(
Arrays.asList(simpleRetryPolicy, new HttpStatusRetryPolicy(config)).toArray(new RetryPolicy[0]));
RetryTemplate retryTemplate = retryTemplateBuilder.customPolicy(compositeRetryPolicy).build();
return retryTemplate.execute(context -> {
ServerResponse serverResponse = next.handle(request);
if (isRetryableStatusCode(serverResponse.statusCode(), config)) {
throw new HttpServerErrorException(serverResponse.statusCode());
}
return serverResponse;
});
};
CompositeRetryPolicy compositeRetryPolicy = new CompositeRetryPolicy();
Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<>();
config.getExceptions().forEach(exception -> retryableExceptions.put(exception, true));
SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(config.getRetries(), retryableExceptions);
compositeRetryPolicy.setPolicies(
Arrays.asList(simpleRetryPolicy, new HttpStatusRetryPolicy(config)).toArray(new RetryPolicy[0]));
RetryTemplate retryTemplate = retryTemplateBuilder.customPolicy(compositeRetryPolicy).build();
return (request, next) -> retryTemplate.execute(context -> {
ServerResponse serverResponse = next.handle(request);
if (isRetryableStatusCode(serverResponse.statusCode(), config)) {
throw new HttpServerErrorException(serverResponse.statusCode());
}
return serverResponse;
});
}
private static boolean isRetryableStatusCode(HttpStatusCode httpStatus, RetryConfig config) {

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

@ -270,6 +270,10 @@ public class ServerMvcIntegrationTests { @@ -270,6 +270,10 @@ public class ServerMvcIntegrationTests {
@Test
public void retryWorks() {
restClient.get().uri("/retry?key=get").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("3");
// test for: java.lang.IllegalArgumentException: You have already selected another
// retry policy
restClient.get().uri("/retry?key=get2").exchange().expectStatus().isOk().expectBody(String.class)
.isEqualTo("3");
}
@Test

Loading…
Cancel
Save