It is common to want to retry if something terrible happened.
You can retry upon failure. The How does retry… retries blog post provides a more detailed overview of the retry mechanism.
|If, despite multiple attempts, it still fails, the failure is propagated downstream.|
To retry on failure, use
Uni<String> u = uni .onFailure().retry().atMost(3); Multi<String> m = multi .onFailure().retry().atMost(3);
You pass the number of retries as a parameter.
retry retries immediately.
When using remote services, it is often better to delay a bit the attempts.
Mutiny provides a method to configure an exponential backoff: a growing delay between retries. Configure the exponential backoff as follows:
Uni<String> u = uni .onFailure().retry() .withBackOff(Duration.ofMillis(100), Duration.ofSeconds(1)) .atMost(3);
The backoff is configured with the initial and max delay. Optionally, you can also configure a jitter to add a pinch of randomness to the delay.
When using exponential backoff, you may not want to configure the max number of attempts (
atMost), but a deadline.
To do so, use either
As an alternative to
atMost, you can also use
This method accepts a predicate called after every failure.
If the predicate returned
true, it retries.
Otherwise, it stops retrying and propagates the last failure downstream:
Uni<String> u = uni .onFailure().retry() .until(f -> shouldWeRetry(f));