From 47d85df622f4f67adb6cd7be5eee044ba7550da8 Mon Sep 17 00:00:00 2001 From: Ilamparithi Natarajan <28389350+ilam-natarajan@users.noreply.github.com> Date: Thu, 28 Dec 2023 21:55:38 +0000 Subject: [PATCH] [java][resttemplate] rethrow original exception when retry limits exceeded in rest template, when the retry limits exceeded rethrow the original exception also add 429 (Too many requests) status code to the retry logic fix #17478 --- .../libraries/resttemplate/ApiClient.mustache | 26 +++++++++++++------ .../org/openapitools/client/ApiClient.java | 26 +++++++++++++------ .../org/openapitools/client/ApiClient.java | 26 +++++++++++++------ .../org/openapitools/client/ApiClient.java | 26 +++++++++++++------ .../org/openapitools/client/ApiClient.java | 26 +++++++++++++------ .../org/openapitools/client/ApiClient.java | 26 +++++++++++++------ .../org/openapitools/client/ApiClient.java | 26 +++++++++++++------ .../org/openapitools/client/ApiClient.java | 26 +++++++++++++------ 8 files changed, 144 insertions(+), 64 deletions(-) diff --git a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache index 6ac032f4caa4..f60c9acc2666 100644 --- a/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache +++ b/modules/openapi-generator/src/main/resources/Java/libraries/resttemplate/ApiClient.mustache @@ -31,6 +31,7 @@ import org.springframework.util.CollectionUtils; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; +import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -772,20 +773,29 @@ public class ApiClient{{#jsr310}} extends JavaTimeFormatter{{/jsr310}} { try { responseEntity = restTemplate.exchange(requestEntity, returnType); break; - } catch (HttpServerErrorException ex) { - attempts++; - if (attempts < maxAttemptsForRetry) { - try { - Thread.sleep(waitTimeMillis); - } catch (InterruptedException e) { - Thread.currentThread().interrupt(); + } catch (HttpServerErrorException | HttpClientErrorException ex) { + if (ex instanceof HttpServerErrorException + || ((HttpClientErrorException) ex) + .getStatusCode() + .equals(HttpStatus.TOO_MANY_REQUESTS)) { + attempts++; + if (attempts < maxAttemptsForRetry) { + try { + Thread.sleep(waitTimeMillis); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + } + } else { + throw ex; } + } else { + throw ex; } } } if (responseEntity == null) { - throw new RestClientException("API returned HttpServerErrorException"); + throw new RestClientException("ResponseEntity is null"); } if (responseEntity.getStatusCode().is2xxSuccessful()) { diff --git a/samples/client/echo_api/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java b/samples/client/echo_api/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java index a3598b82e197..b22902e928bd 100644 --- a/samples/client/echo_api/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java +++ b/samples/client/echo_api/java/resttemplate/src/main/java/org/openapitools/client/ApiClient.java @@ -22,6 +22,7 @@ import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; +import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.HttpServerErrorException; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; @@ -688,20 +689,29 @@ public ResponseEntity invokeAPI(String path, HttpMethod method, Map ResponseEntity invokeAPI(String path, HttpMethod method, Map ResponseEntity invokeAPI(String path, HttpMethod method, Map ResponseEntity invokeAPI(String path, HttpMethod method, Map ResponseEntity invokeAPI(String path, HttpMethod method, Map ResponseEntity invokeAPI(String path, HttpMethod method, Map ResponseEntity invokeAPI(String path, HttpMethod method, Map