Retry Policy

  1. Attempts
  2. Delays
    1. Jitter
  3. Duration
  4. Aborts
  5. Failure Handling
  6. Event Listeners

Retry policies express when retries should be performed for an execution.

Attempts

By default, a RetryPolicy will perform a maximum of 3 execution attempts. You can configure a different max number of attempts:

builder.withMaxAttempts(3);

Or a max number of retries

builder.withMaxRetries(2);

Delays

By default, a RetryPolicy has no delay between attempts. You can configure a fixed delay:

builder.withDelay(Duration.ofSeconds(1));

Or a delay that backs off exponentially:

builder.withBackoff(1, 30, ChronoUnit.SECONDS);

A random delay for some range:

builder.withDelay(1, 10, ChronoUnit.SECONDS);

Or a computed delay based on an execution result or exception.

Jitter

You can also combine a random jitter factor with a delay:

builder.withJitter(.1);

Or a time based jitter:

builder.withJitter(Duration.ofMillis(100));

Duration

You can add a max duration for an execution, after which retries will stop:

builder.withMaxDuration(Duration.ofMinutes(5));

To cancel or interrupt running executions, see the Timeout policy.

Aborts

You can also specify which results, exceptions, or conditions to abort retries on:

builder
  .abortWhen(true)
  .abortOn(NoRouteToHostException.class)
  .abortIf(result -> result == true)

Failure Handling

A RetryPolicy can be configured to handle only certain results or exceptions, in combination with any of the configuration described above:

builder
  .handle(ConnectException.class)
  .handleResult(null);

Event Listeners

In addition to the standard policy listeners, a RetryPolicy can notify you when an execution attempt fails or before a retry is to be attempted:

builder
  .onFailedAttempt(e -> log.error("Connection attempt failed", e.getLastException()))
  .onRetry(e -> log.warn("Failure #{}. Retrying.", e.getAttemptCount()));

It can notify you when an execution fails and the max retries are exceeded:

builder.onRetriesExceeded(e -> log.warn("Failed to connect. Max retries exceeded."));

When an async retry is scheduled to be attempted after the configured delay:

builder.onRetryScheduled(e -> log.info("Connection retry scheduled {}.", e.getException()));

Or when retries have been aborted:

builder.onAbort(e -> log.warn("Connection aborted due to {}.", e.getException()));