Top Description Fields Constructors Methods
reactor.util.retry

public final Class RetrySpec

extends Retry
Class Inheritance
Imports
java.time.Duration, java.util.Objects, java.util.function.BiFunction, .Consumer, .Function, .Predicate, reactor.core.Exceptions, reactor.core.publisher.Flux, .Mono, reactor.util.context.Context, .ContextView

A simple count-based 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 reactor.core.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é

Field Summary

Modifier and TypeField and Description
pack-priv final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>>
pack-priv final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>>
pack-priv final Consumer<Retry.RetrySignal>
pack-priv final Consumer<Retry.RetrySignal>
public final Predicate<Throwable>
errorFilter

The configured Predicate to filter which exceptions to retry.

public final boolean
isTransientErrors

The configured transient error handling flag.

pack-priv static final Duration
public final long
maxAttempts

The configured maximum for retry attempts.

pack-priv static final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>>
pack-priv static final Consumer<Retry.RetrySignal>
pack-priv static final BiFunction<RetrySpec, Retry.RetrySignal, Throwable>
pack-priv final BiFunction<RetrySpec, Retry.RetrySignal, Throwable>
Inherited from reactor.util.retry.Retry:
retryContext

Constructor Summary

AccessConstructor and Description
pack-priv
RetrySpec(ContextView retryContext, long max, Predicate<? super Throwable> aThrowablePredicate, boolean isTransientErrors, Consumer<Retry.RetrySignal> doPreRetry, Consumer<Retry.RetrySignal> doPostRetry, BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPreRetry, BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPostRetry, BiFunction<RetrySpec, Retry.RetrySignal, Throwable> retryExhaustedGenerator)

Copy constructor.

Method Summary

Modifier and TypeMethod and Description
pack-priv static <T> Mono<T>
applyHooks(Retry.RetrySignal copyOfSignal, Mono<T> originalCompanion, final Consumer<Retry.RetrySignal> doPreRetry, final Consumer<Retry.RetrySignal> doPostRetry, final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPreRetry, final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPostRetry, final ContextView cv)

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
doAfterRetry
(Consumer<Retry.RetrySignal>
the synchronous hook to execute after retry trigger is started
doAfterRetry
)

Add synchronous behavior to be executed after the retry trigger is emitted in the companion publisher.

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
doAfterRetryAsync
(Function<Retry.RetrySignal, Mono<Void>>
the asynchronous hook to execute after original retry trigger is emitted
doAsyncAfterRetry
)

Add asynchronous behavior to be executed after the current retry trigger in the companion publisher, thus delaying the resulting retry trigger with the additional Mono.

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
doBeforeRetry
(Consumer<Retry.RetrySignal>
the synchronous hook to execute before retry trigger is emitted
doBeforeRetry
)

Add synchronous behavior to be executed before the retry trigger is emitted in the companion publisher.

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
doBeforeRetryAsync
(Function<Retry.RetrySignal, Mono<Void>>
the asynchronous hook to execute before original retry trigger is emitted
doAsyncBeforeRetry
)

Add asynchronous behavior to be executed before the current retry trigger in the companion publisher, thus delaying the resulting retry trigger with the additional Mono.

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
filter
(Predicate<? super Throwable>
the predicate to filter which exceptions can be retried
errorFilter
)

Set the Predicate that will filter which errors can be retried.

public Flux<Long>
generateCompanion(Flux<Retry.RetrySignal>
the errors from the outer publisher as RetrySignal objects, containing the Throwable causing the error as well as retry counter metadata.
flux
)

Implements abstract reactor.util.retry.Retry.generateCompanion.

Generates the companion publisher responsible for reacting to incoming RetrySignal emissions, effectively deciding when to retry.
public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as a Retry
maxAttempts
(long
the new retry attempt limit
maxAttempts
)

Set the maximum number of retry attempts allowed.

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
modifyErrorFilter
(Function<Predicate<Throwable>, Predicate<? super Throwable>>
a Function that returns a new Predicate given the currently in place Predicate (usually deriving from the old predicate).
predicateAdjuster
)

Allows to augment a previously set Predicate with a new condition to allow retries of some exception or not.

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
onRetryExhaustedThrow
(BiFunction<RetrySpec, Retry.RetrySignal, Throwable>
the Function that generates the Throwable for the last reactor.util.retry.Retry.RetrySignal
retryExhaustedGenerator
)

Set the generator for the Exception to be propagated when the maximum amount of retries is exhausted.

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
transientErrors
(boolean
true to activate transient mode
isTransientErrors
)

Set the transient error mode, indicating that the strategy being built should use reactor.util.retry.Retry.RetrySignal#totalRetriesInARow() rather than reactor.util.retry.Retry.RetrySignal#totalRetries().

public RetrySpec

Returns:

a new copy of the RetrySpec which can either be further configured or used as Retry
withRetryContext
(ContextView
a new snapshot of user provided data
retryContext
)

Set the user provided context that can be used to manipulate state on retries.

Inherited from reactor.util.retry.Retry:
backofffixedDelayfromindefinitelymaxmaxInARowretryContextwithThrowable

Field Detail

asyncPostRetryback to summary
pack-priv final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPostRetry
asyncPreRetryback to summary
pack-priv final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPreRetry
doPostRetryback to summary
pack-priv final Consumer<Retry.RetrySignal> doPostRetry
doPreRetryback to summary
pack-priv final Consumer<Retry.RetrySignal> doPreRetry
errorFilterback to summary
public final Predicate<Throwable> errorFilter

The configured Predicate to filter which exceptions to retry.

See Also
filter(Predicate), modifyErrorFilter(Function)
isTransientErrorsback to summary
public final boolean isTransientErrors

The configured transient error handling flag.

See Also
transientErrors(boolean)
MAX_BACKOFFback to summary
pack-priv static final Duration MAX_BACKOFF
maxAttemptsback to summary
public final long maxAttempts

The configured maximum for retry attempts.

See Also
maxAttempts(long)
NO_OP_BIFUNCTIONback to summary
pack-priv static final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> NO_OP_BIFUNCTION
NO_OP_CONSUMERback to summary
pack-priv static final Consumer<Retry.RetrySignal> NO_OP_CONSUMER
RETRY_EXCEPTION_GENERATORback to summary
pack-priv static final BiFunction<RetrySpec, Retry.RetrySignal, Throwable> RETRY_EXCEPTION_GENERATOR
retryExhaustedGeneratorback to summary
pack-priv final BiFunction<RetrySpec, Retry.RetrySignal, Throwable> retryExhaustedGenerator

Constructor Detail

RetrySpecback to summary
pack-priv RetrySpec(ContextView retryContext, long max, Predicate<? super Throwable> aThrowablePredicate, boolean isTransientErrors, Consumer<Retry.RetrySignal> doPreRetry, Consumer<Retry.RetrySignal> doPostRetry, BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPreRetry, BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPostRetry, BiFunction<RetrySpec, Retry.RetrySignal, Throwable> retryExhaustedGenerator)

Copy constructor.

Method Detail

applyHooksback to summary
pack-priv static <T> Mono<T> applyHooks(Retry.RetrySignal copyOfSignal, Mono<T> originalCompanion, final Consumer<Retry.RetrySignal> doPreRetry, final Consumer<Retry.RetrySignal> doPostRetry, final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPreRetry, final BiFunction<Retry.RetrySignal, Mono<Void>, Mono<Void>> asyncPostRetry, final ContextView cv)
doAfterRetryback to summary
public RetrySpec doAfterRetry(Consumer<Retry.RetrySignal> 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.

Parameters
doAfterRetry:Consumer<Retry.RetrySignal>

the synchronous hook to execute after retry trigger is started

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry

See Also
andRetryThen for an asynchronous version
doAfterRetryAsyncback to summary
public RetrySpec 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 additional Mono.

Parameters
doAsyncAfterRetry:Function<Retry.RetrySignal, Mono<Void>>

the asynchronous hook to execute after original retry trigger is emitted

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry

doBeforeRetryback to summary
public RetrySpec doBeforeRetry(Consumer<Retry.RetrySignal> 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.

Parameters
doBeforeRetry:Consumer<Retry.RetrySignal>

the synchronous hook to execute before retry trigger is emitted

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry

See Also
andDelayRetryWith for an asynchronous version
doBeforeRetryAsyncback to summary
public RetrySpec 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 additional Mono.

Parameters
doAsyncBeforeRetry:Function<Retry.RetrySignal, Mono<Void>>

the asynchronous hook to execute before original retry trigger is emitted

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry

filterback to summary
public RetrySpec filter(Predicate<? super Throwable> errorFilter)

Set the Predicate that 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.

Parameters
errorFilter:Predicate<? super Throwable>

the predicate to filter which exceptions can be retried

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry

generateCompanionback to summary
public Flux<Long> generateCompanion(Flux<Retry.RetrySignal> flux)

Implements abstract reactor.util.retry.Retry.generateCompanion.

Doc from reactor.util.retry.Retry.generateCompanion.

Generates the companion publisher responsible for reacting to incoming RetrySignal emissions, effectively deciding when to retry.

When the source signals an error, that onError signal will be suppressed. Its Throwable will instead be attached to a RetrySignal, immediately emitted on the retrySignals publisher. 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 onNext emitted by the companion publisher triggers a retry, onError will fail the outer publisher and onComplete will 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 Flux of RetrySignal without modification. This would render a retry strategy that immediately retries, forever.

Parameters
flux:Flux<Retry.RetrySignal>

the errors from the outer publisher as RetrySignal objects, containing the Throwable causing the error as well as retry counter metadata.

Returns:Flux<Long>

the companion publisher responsible for reacting to incoming RetrySignal emissions, effectively deciding when to retry.

Annotations
@Override
maxAttemptsback to summary
public RetrySpec maxAttempts(long 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.

Parameters
maxAttempts:long

the new retry attempt limit

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as a Retry

modifyErrorFilterback to summary
public RetrySpec modifyErrorFilter(Function<Predicate<Throwable>, Predicate<? super Throwable>> predicateAdjuster)

Allows to augment a previously set Predicate with a new condition to allow retries of some exception or not. This can typically be used with Predicate#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));
Parameters
predicateAdjuster:Function<Predicate<Throwable>, Predicate<? super Throwable>>

a Function that returns a new Predicate given the currently in place Predicate (usually deriving from the old predicate).

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry

onRetryExhaustedThrowback to summary
public RetrySpec onRetryExhaustedThrow(BiFunction<RetrySpec, Retry.RetrySignal, Throwable> retryExhaustedGenerator)

Set the generator for the Exception to be propagated when the maximum amount of retries is exhausted. By default, throws an Exceptions#retryExhausted(String, Throwable) with the message reflecting the total attempt index, transient attempt index and maximum retry count. The cause of the last reactor.util.retry.Retry.RetrySignal is also added as the exception's cause.

Parameters
retryExhaustedGenerator:BiFunction<RetrySpec, Retry.RetrySignal, Throwable>

the Function that generates the Throwable for the last reactor.util.retry.Retry.RetrySignal

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry

transientErrorsback to summary
public RetrySpec transientErrors(boolean isTransientErrors)

Set the transient error mode, indicating that the strategy being built should use reactor.util.retry.Retry.RetrySignal#totalRetriesInARow() rather than reactor.util.retry.Retry.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.

Parameters
isTransientErrors:boolean

true to activate transient mode

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry

withRetryContextback to summary
public RetrySpec withRetryContext(ContextView retryContext)

Set the user provided context that can be used to manipulate state on retries.

Parameters
retryContext:ContextView

a new snapshot of user provided data

Returns:RetrySpec

a new copy of the RetrySpec which can either be further configured or used as Retry