Class RetrySpec
Retry strategy with configurable features. Use Retry.max(long),
Retry.maxInARow(long) or Retry.indefinitely() to obtain a preconfigured instance to start with.
Only errors that match the filter(Predicate) are retried (by default all), up to maxAttempts(long) times.
When the maximum attempt of retries is reached, a runtime exception is propagated downstream which
can be pinpointed with Exceptions.isRetryExhausted(Throwable). The cause of
the last attempt's failure is attached as said retryExhausted
exception's cause. This can be customized with onRetryExhaustedThrow(BiFunction).
Additionally, to help dealing with bursts of transient errors in a long-lived Flux as if each burst
had its own attempt counter, one can choose to set transientErrors(boolean) to true.
The comparison to maxAttempts(long) will then be done with the number of subsequent attempts
that failed without an onNext in between.
The RetrySpec is copy-on-write and as such can be stored as a "template" and further configured
by different components without a risk of modifying the original configuration.
- Author:
- Simon Baslé
-
Nested Class Summary
Nested classes/interfaces inherited from class reactor.util.retry.Retry
Retry.RetrySignal -
Field Summary
FieldsModifier and TypeFieldDescriptionThe configuredPredicateto filter which exceptions to retry.final booleanThe configured transient error handling flag.final longThe configured maximum for retry attempts.Fields inherited from class reactor.util.retry.Retry
retryContext -
Method Summary
Modifier and TypeMethodDescriptiondoAfterRetry(Consumer<Retry.RetrySignal> doAfterRetry) Add synchronous behavior to be executed after the retry trigger is emitted in the companion publisher.doAfterRetryAsync(Function<Retry.RetrySignal, Mono<Void>> doAsyncAfterRetry) Add asynchronous behavior to be executed after the current retry trigger in the companion publisher, thus delaying the resulting retry trigger with the additionalMono.doBeforeRetry(Consumer<Retry.RetrySignal> doBeforeRetry) Add synchronous behavior to be executed before the retry trigger is emitted in the companion publisher.doBeforeRetryAsync(Function<Retry.RetrySignal, Mono<Void>> doAsyncBeforeRetry) Add asynchronous behavior to be executed before the current retry trigger in the companion publisher, thus delaying the resulting retry trigger with the additionalMono.Set thePredicatethat will filter which errors can be retried.Generates the companion publisher responsible for reacting to incomingRetry.RetrySignalemissions, effectively deciding when to retry.maxAttempts(long maxAttempts) Set the maximum number of retry attempts allowed.onRetryExhaustedThrow(BiFunction<RetrySpec, Retry.RetrySignal, Throwable> retryExhaustedGenerator) Set the generator for theExceptionto be propagated when the maximum amount of retries is exhausted.transientErrors(boolean isTransientErrors) Set the transient error mode, indicating that the strategy being built should useRetry.RetrySignal.totalRetriesInARow()rather thanRetry.RetrySignal.totalRetries().withRetryContext(ContextView retryContext) Set the user providedcontextthat can be used to manipulate state on retries.Methods inherited from class reactor.util.retry.Retry
backoff, fixedDelay, from, indefinitely, max, maxInARow, retryContext, withThrowable
-
Field Details
-
maxAttempts
public final long maxAttemptsThe configured maximum for retry attempts.- See Also:
-
errorFilter
The configuredPredicateto filter which exceptions to retry.- See Also:
-
isTransientErrors
public final boolean isTransientErrorsThe configured transient error handling flag.- See Also:
-
-
Method Details
-
withRetryContext
Set the user providedcontextthat can be used to manipulate state on retries. -
maxAttempts
Set the maximum number of retry attempts allowed. 1 meaning "1 retry attempt": the original subscription plus an extra re-subscription in case of an error, but no more. -
filter
Set thePredicatethat will filter which errors can be retried. Exceptions that don't pass the predicate will be propagated downstream and terminate the retry sequence. Defaults to allowing retries for all exceptions. -
modifyErrorFilter
public RetrySpec modifyErrorFilter(Function<Predicate<Throwable>, Predicate<? super Throwable>> predicateAdjuster) Allows to augment a previouslysetPredicatewith a new condition to allow retries of some exception or not. This can typically be used withPredicate.and(Predicate)to combine existing predicate(s) with a new one.For example:
//given RetrySpec retryTwiceIllegalArgument = Retry.max(2) .filter(e -> e instanceof IllegalArgumentException); RetrySpec retryTwiceIllegalArgWithCause = retryTwiceIllegalArgument.modifyErrorFilter(old -> old.and(e -> e.getCause() != null)); -
doBeforeRetry
Add synchronous behavior to be executed before the retry trigger is emitted in the companion publisher. This should not be blocking, as the companion publisher might be executing in a shared thread. -
doAfterRetry
Add synchronous behavior to be executed after the retry trigger is emitted in the companion publisher. This should not be blocking, as the companion publisher might be publishing events in a shared thread. -
doBeforeRetryAsync
Add asynchronous behavior to be executed before the current retry trigger in the companion publisher, thus delaying the resulting retry trigger with the additionalMono. -
doAfterRetryAsync
Add asynchronous behavior to be executed after the current retry trigger in the companion publisher, thus delaying the resulting retry trigger with the additionalMono. -
onRetryExhaustedThrow
public RetrySpec onRetryExhaustedThrow(BiFunction<RetrySpec, Retry.RetrySignal, Throwable> retryExhaustedGenerator) Set the generator for theExceptionto be propagated when the maximum amount of retries is exhausted. By default, throws anExceptions.retryExhausted(String, Throwable)with the message reflecting the total attempt index, transient attempt index and maximum retry count. The cause of the lastRetry.RetrySignalis also added as the exception's cause.- Parameters:
retryExhaustedGenerator- theFunctionthat generates theThrowablefor the lastRetry.RetrySignal- Returns:
- a new copy of the
RetrySpecwhich can either be further configured or used asRetry
-
transientErrors
Set the transient error mode, indicating that the strategy being built should useRetry.RetrySignal.totalRetriesInARow()rather thanRetry.RetrySignal.totalRetries(). Transient errors are errors that could occur in bursts but are then recovered from by a retry (with one or more onNext signals) before another error occurs.In the case of a simple count-based retry, this means that the
maxAttempts(long)is applied to each burst individually. -
generateCompanion
Description copied from class:RetryGenerates the companion publisher responsible for reacting to incomingRetry.RetrySignalemissions, effectively deciding when to retry.When the source signals an error, that
onErrorsignal will be suppressed. ItsThrowablewill instead be attached to aRetry.RetrySignal, immediately emitted on theretrySignalspublisher. Right after that emission,request(1)is called on the companion publisher.The response to that request decides if a retry should be made. Thus, the outer publisher will wait until a signal is emitted by the companion publisher, making it possible to delay retry attempts.
Any
onNextemitted by the companion publisher triggers a retry,onErrorwill fail the outer publisher andonCompletewill complete the outer publisher (effectively suppressing the original error/Throwable).As an example, the simplest form of retry companion would be to return the incoming
FluxofRetry.RetrySignalwithout modification. This would render a retry strategy that immediately retries, forever.- Specified by:
generateCompanionin classRetry- Parameters:
flux- the errors from the outer publisher asRetry.RetrySignalobjects, containing theThrowablecausing the error as well as retry counter metadata.- Returns:
- the companion publisher responsible for reacting to incoming
Retry.RetrySignalemissions, effectively deciding when to retry.
-