Browse Source

Allow FixedBackOff to be constructed with only a custom interval

This commit introduces two new constructors:

- FixedBackOff(long)

- FixedBackOff(Duration)

Closes gh-35028
pull/35030/head
Sam Brannen 6 months ago
parent
commit
8b9e620084
  1. 3
      spring-core/src/main/java/org/springframework/core/retry/RetryTemplate.java
  2. 24
      spring-core/src/main/java/org/springframework/util/backoff/FixedBackOff.java
  3. 8
      spring-core/src/test/java/org/springframework/core/retry/RetryTemplateTests.java
  4. 20
      spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java

3
spring-core/src/main/java/org/springframework/core/retry/RetryTemplate.java

@ -16,6 +16,7 @@
package org.springframework.core.retry; package org.springframework.core.retry;
import java.time.Duration;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@ -60,7 +61,7 @@ public class RetryTemplate implements RetryOperations {
protected RetryPolicy retryPolicy = new MaxRetryAttemptsPolicy(); protected RetryPolicy retryPolicy = new MaxRetryAttemptsPolicy();
protected BackOff backOffPolicy = new FixedBackOff(1000, Long.MAX_VALUE); protected BackOff backOffPolicy = new FixedBackOff(Duration.ofSeconds(1));
protected RetryListener retryListener = new RetryListener() { protected RetryListener retryListener = new RetryListener() {
}; };

24
spring-core/src/main/java/org/springframework/util/backoff/FixedBackOff.java

@ -16,6 +16,8 @@
package org.springframework.util.backoff; package org.springframework.util.backoff;
import java.time.Duration;
/** /**
* A simple {@link BackOff} implementation that provides a fixed interval * A simple {@link BackOff} implementation that provides a fixed interval
* between two attempts and a maximum number of retries. * between two attempts and a maximum number of retries.
@ -50,6 +52,28 @@ public class FixedBackOff implements BackOff {
public FixedBackOff() { public FixedBackOff() {
} }
/**
* Create an instance with the supplied interval and an unlimited number of
* attempts.
* @param interval the interval between two attempts in milliseconds
* @since 7.0
* @see #setMaxAttempts(long)
*/
public FixedBackOff(long interval) {
this.interval = interval;
}
/**
* Create an instance with the supplied interval and an unlimited number of
* attempts.
* @param interval the interval between two attempts
* @since 7.0
* @see #setMaxAttempts(long)
*/
public FixedBackOff(Duration interval) {
this.interval = interval.toMillis();
}
/** /**
* Create an instance with the supplied interval and maximum number of attempts. * Create an instance with the supplied interval and maximum number of attempts.
* @param interval the interval between two attempts in milliseconds * @param interval the interval between two attempts in milliseconds

8
spring-core/src/test/java/org/springframework/core/retry/RetryTemplateTests.java

@ -16,6 +16,8 @@
package org.springframework.core.retry; package org.springframework.core.retry;
import java.time.Duration;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.springframework.core.retry.support.MaxRetryAttemptsPolicy; import org.springframework.core.retry.support.MaxRetryAttemptsPolicy;
@ -55,7 +57,7 @@ class RetryTemplateTests {
} }
}; };
retryTemplate.setBackOffPolicy(new FixedBackOff(100, Long.MAX_VALUE)); retryTemplate.setBackOffPolicy(new FixedBackOff(Duration.ofMillis(10)));
assertThat(retryTemplate.execute(retryable)).isEqualTo("hello world"); assertThat(retryTemplate.execute(retryable)).isEqualTo("hello world");
} }
@ -76,7 +78,7 @@ class RetryTemplateTests {
} }
}; };
retryTemplate.setBackOffPolicy(new FixedBackOff(100, Long.MAX_VALUE)); retryTemplate.setBackOffPolicy(new FixedBackOff(Duration.ofMillis(10)));
assertThatExceptionOfType(RetryException.class) assertThatExceptionOfType(RetryException.class)
.isThrownBy(() -> retryTemplate.execute(retryable)) .isThrownBy(() -> retryTemplate.execute(retryable))
@ -123,7 +125,7 @@ class RetryTemplateTests {
} }
}; };
retryTemplate.setRetryPolicy(retryPolicy); retryTemplate.setRetryPolicy(retryPolicy);
retryTemplate.setBackOffPolicy(new FixedBackOff(100, Long.MAX_VALUE)); retryTemplate.setBackOffPolicy(new FixedBackOff(Duration.ofMillis(10)));
assertThatExceptionOfType(RetryException.class) assertThatExceptionOfType(RetryException.class)
.isThrownBy(() -> retryTemplate.execute(retryable)) .isThrownBy(() -> retryTemplate.execute(retryable))

20
spring-jms/src/main/java/org/springframework/jms/listener/DefaultMessageListenerContainer.java

@ -1,5 +1,5 @@
/* /*
* Copyright 2002-2024 the original author or authors. * Copyright 2002-2025 the original author or authors.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@ -194,7 +194,7 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
private boolean virtualThreads = false; private boolean virtualThreads = false;
private BackOff backOff = new FixedBackOff(DEFAULT_RECOVERY_INTERVAL, Long.MAX_VALUE); private BackOff backOff = new FixedBackOff(DEFAULT_RECOVERY_INTERVAL);
private int cacheLevel = CACHE_AUTO; private int cacheLevel = CACHE_AUTO;
@ -278,8 +278,8 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
* between recovery attempts. If the {@link BackOffExecution} implementation * between recovery attempts. If the {@link BackOffExecution} implementation
* returns {@link BackOffExecution#STOP}, this listener container will not further * returns {@link BackOffExecution#STOP}, this listener container will not further
* attempt to recover. * attempt to recover.
* <p>The {@link #setRecoveryInterval(long) recovery interval} is ignored * <p>Note that setting the {@linkplain #setRecoveryInterval(long) recovery
* when this property is set. * interval} overrides this property.
* @since 4.1 * @since 4.1
*/ */
public void setBackOff(BackOff backOff) { public void setBackOff(BackOff backOff) {
@ -288,15 +288,17 @@ public class DefaultMessageListenerContainer extends AbstractPollingMessageListe
/** /**
* Specify the interval between recovery attempts, in <b>milliseconds</b>. * Specify the interval between recovery attempts, in <b>milliseconds</b>.
* The default is 5000 ms, that is, 5 seconds. This is a convenience method * <p>The default is 5000 ms, that is, 5 seconds.
* to create a {@link FixedBackOff} with the specified interval. * <p>This is a convenience method to create a {@link FixedBackOff} with the
* <p>For more recovery options, consider specifying a {@link BackOff} * specified interval. For more recovery options, consider specifying a
* instance instead. * {@link #setBackOff(BackOff) BackOff} instance instead. Note, however, that
* explicitly setting the {@link #setBackOff(BackOff) BackOff} overrides this
* property.
* @see #setBackOff(BackOff) * @see #setBackOff(BackOff)
* @see #handleListenerSetupFailure * @see #handleListenerSetupFailure
*/ */
public void setRecoveryInterval(long recoveryInterval) { public void setRecoveryInterval(long recoveryInterval) {
this.backOff = new FixedBackOff(recoveryInterval, Long.MAX_VALUE); this.backOff = new FixedBackOff(recoveryInterval);
} }
/** /**

Loading…
Cancel
Save