From a8dc202edfdeb0cea5928ed78b0f6b803241c7be Mon Sep 17 00:00:00 2001 From: sgibb Date: Thu, 3 Aug 2023 15:49:44 -0400 Subject: [PATCH] One RetryTemplate be route. If not, it causes an IllegalArgumentException --- .../mvc/filter/RetryFilterFunctions.java | 30 +++++++++---------- .../server/mvc/ServerMvcIntegrationTests.java | 4 +++ 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java b/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java index b09b0306..10ccd37b 100644 --- a/spring-cloud-gateway-server-mvc/src/main/java/org/springframework/cloud/gateway/server/mvc/filter/RetryFilterFunctions.java +++ b/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 { RetryConfig config = new RetryConfig(); configConsumer.accept(config); RetryTemplateBuilder retryTemplateBuilder = RetryTemplate.builder(); - return (request, next) -> { - CompositeRetryPolicy compositeRetryPolicy = new CompositeRetryPolicy(); - Map, 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); + CompositeRetryPolicy compositeRetryPolicy = new CompositeRetryPolicy(); + Map, 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; - }); - }; + if (isRetryableStatusCode(serverResponse.statusCode(), config)) { + throw new HttpServerErrorException(serverResponse.statusCode()); + } + return serverResponse; + }); } private static boolean isRetryableStatusCode(HttpStatusCode httpStatus, RetryConfig config) { diff --git a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java index 19011db9..4954124c 100644 --- a/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java +++ b/spring-cloud-gateway-server-mvc/src/test/java/org/springframework/cloud/gateway/server/mvc/ServerMvcIntegrationTests.java @@ -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