Document behavior for 0 delay combined with jitter

Closes gh-36946
This commit is contained in:
Sam Brannen
2026-06-17 12:41:03 +02:00
parent 0d706f8da6
commit 846a6a8f7c
4 changed files with 27 additions and 0 deletions
@@ -81,6 +81,13 @@ public void sendNotification() {
}
----
[NOTE]
====
When `delay` is `0` combined with a positive `jitter`, the delay never grows
regardless of any configured `multiplier`, so the full configured `jitter` is
applied directly as a random delay in the range from `0` to `min(jitter, maxDelay)`.
====
Last but not least, `@Retryable` also works for reactive methods with a reactive return
type, decorating the pipeline with Reactor's retry capabilities:
@@ -263,6 +270,13 @@ and an exponential back-off strategy with a bit of jitter.
() -> jmsClient.destination("notifications").send(...));
----
[NOTE]
====
When `delay` is zero combined with a positive `jitter`, the delay never grows
regardless of any configured `multiplier`, so the full configured `jitter` is
applied directly as a random delay in the range from zero to `min(jitter, maxDelay)`.
====
[TIP]
====
Although the factory methods and builder API for `RetryPolicy` cover most common
@@ -197,6 +197,10 @@ public @interface Retryable {
* and {@code delay + jitter} but never below the base {@link #delay()} or
* above {@link #maxDelay()}. If a multiplier is specified, it is applied
* to the jitter value as well.
* <p>When {@link #delay()} is {@code 0} combined with a positive jitter,
* the delay never grows regardless of any configured multiplier, so the
* full configured jitter is applied directly as a random delay in the range
* from {@code 0} to {@code min(jitter, maxDelay)}.
* <p>The time unit is milliseconds by default but can be overridden via
* {@link #timeUnit}.
* <p>The default is 0 (no jitter).
@@ -281,6 +281,11 @@ public interface RetryPolicy {
* {@linkplain #maxDelay(Duration) max delay}.
* <p>If a {@linkplain #multiplier(double) multiplier} is specified, it
* is applied to the jitter value as well.
* <p>When the configured {@linkplain #delay(Duration) delay} is zero
* combined with a positive jitter, the delay never grows regardless of
* any configured multiplier, so the full configured jitter is applied
* directly as a random delay in the range from zero to
* {@code min(jitter, maxDelay)}.
* <p>The default is no jitter.
* <p>The supplied value will override any previously configured value.
* <p>You should not specify this configuration option if you have
@@ -154,6 +154,10 @@ public class ExponentialBackOff implements BackOff {
* {@code initialInterval} or above {@code maxInterval}.
* <p>If a {@code multiplier} is specified, it is applied to the jitter value
* as well.
* <p>When {@code initialInterval} is {@code 0} combined with a positive
* jitter, the interval never grows regardless of any configured multiplier,
* so the full configured jitter is applied directly as a random interval in
* the range from {@code 0} to {@code min(jitter, maxInterval)}.
* @param jitter the jitter value in milliseconds
* @since 7.0
*/