From 0b92d82a2b600558c8075398965fb55c2770bb2b Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Tue, 21 Nov 2023 15:23:27 -0500 Subject: [PATCH] Add support for random exponential backoff policy. Fixes #2351 (#2353) Co-authored-by: Ryan Baxter <524254+ryanjbaxter@users.noreply.github.com> --- docs/src/main/asciidoc/spring-cloud-config.adoc | 1 + .../cloud/config/client/RetryProperties.java | 13 +++++++++++++ .../cloud/config/client/RetryTemplateFactory.java | 6 +++--- ...ConfigServerConfigDataLocationResolverTests.java | 2 ++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/docs/src/main/asciidoc/spring-cloud-config.adoc b/docs/src/main/asciidoc/spring-cloud-config.adoc index af52458e..ff78863b 100644 --- a/docs/src/main/asciidoc/spring-cloud-config.adoc +++ b/docs/src/main/asciidoc/spring-cloud-config.adoc @@ -1906,6 +1906,7 @@ First, you need to set `spring.cloud.config.fail-fast=true`. Then you need to add `spring-retry` and `spring-boot-starter-aop` to your classpath. The default behavior is to retry six times with an initial backoff interval of 1000ms and an exponential multiplier of 1.1 for subsequent backoffs. You can configure these properties (and others) by setting the `spring.cloud.config.retry.*` configuration properties. +To use a random exponential backoff policy set `spring.cloud.config.retry.useRandomPolicy` to `true`. TIP: To take full control of the retry behavior and are using legacy bootstrap, add a `@Bean` of type `RetryOperationsInterceptor` with an ID of `configServerRetryInterceptor`. Spring Retry has a `RetryInterceptorBuilder` that supports creating one. diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryProperties.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryProperties.java index 903f0c8b..7eb88e77 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryProperties.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryProperties.java @@ -50,6 +50,11 @@ public class RetryProperties { */ int maxAttempts = 6; + /** + * Use a random exponential backoff policy. + */ + boolean useRandomPolicy = false; + public long getInitialInterval() { return this.initialInterval; } @@ -82,4 +87,12 @@ public class RetryProperties { this.maxAttempts = maxAttempts; } + public boolean isUseRandomPolicy() { + return this.useRandomPolicy; + } + + public void setUseRandomPolicy(boolean useRandomPolicy) { + this.useRandomPolicy = useRandomPolicy; + } + } diff --git a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryTemplateFactory.java b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryTemplateFactory.java index 5aa2abbc..068ea985 100644 --- a/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryTemplateFactory.java +++ b/spring-cloud-config-client/src/main/java/org/springframework/cloud/config/client/RetryTemplateFactory.java @@ -39,9 +39,9 @@ public final class RetryTemplateFactory { } public static RetryTemplate create(RetryProperties properties, Log log) { - RetryTemplate retryTemplate = RetryTemplate.builder().maxAttempts(properties.getMaxAttempts()) - .exponentialBackoff(properties.getInitialInterval(), properties.getMultiplier(), - properties.getMaxInterval()) + RetryTemplate retryTemplate = RetryTemplate + .builder().maxAttempts(properties.getMaxAttempts()).exponentialBackoff(properties.getInitialInterval(), + properties.getMultiplier(), properties.getMaxInterval(), properties.isUseRandomPolicy()) .build(); try { field.set(retryTemplate, log); diff --git a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java index 504050a8..f2f3c822 100644 --- a/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java +++ b/spring-cloud-config-client/src/test/java/org/springframework/cloud/config/client/ConfigServerConfigDataLocationResolverTests.java @@ -138,6 +138,7 @@ public class ConfigServerConfigDataLocationResolverTests { assertThat(resource.getRetryProperties().getMaxInterval()).isEqualTo(defaultRetry.getMaxInterval()); assertThat(resource.getRetryProperties().getInitialInterval()).isEqualTo(defaultRetry.getInitialInterval()); assertThat(resource.getRetryProperties().getMultiplier()).isEqualTo(defaultRetry.getMultiplier()); + assertThat(resource.getRetryProperties().isUseRandomPolicy()).isEqualTo(defaultRetry.isUseRandomPolicy()); } @Test @@ -158,6 +159,7 @@ public class ConfigServerConfigDataLocationResolverTests { assertThat(resource.getRetryProperties().getMaxInterval()).isEqualTo(1500); assertThat(resource.getRetryProperties().getInitialInterval()).isEqualTo(1100); assertThat(resource.getRetryProperties().getMultiplier()).isEqualTo(1.2); + assertThat(resource.getRetryProperties().isUseRandomPolicy()).isEqualTo(false); } @Test