- java.lang.Object
-
- org.refcodes.controlflow.RetryCounter
-
- All Implemented Interfaces:
Retryable
,org.refcodes.mixin.Abortable
,org.refcodes.mixin.Restartable
,org.refcodes.mixin.RetryCountAccessor
,org.refcodes.mixin.RetryNumberAccessor
public class RetryCounter extends Object implements Retryable, org.refcodes.mixin.RetryNumberAccessor, org.refcodes.mixin.RetryCountAccessor
TheRetryCounter
can be used in loops to test whether a retry should take place and in case a retry is to take place, then a given period of time (delay) is waited and the internal retry counter is decremented. In case no more retries are "available" the business logic may act accordingly such as throwing an exception.In case a delay greater than 0 is set, then each retry is being delayed by the according amount of milliseconds, in case no retries are left, then delaying is skipped. A delay of 0 or smaller skips delaying altogether.
The first call to
nextRetry()
does not delay as the first call is not considered to be a retry. In case an exponential retry delay extension time has been provided, then the retry delay upon callingnextRetry()
is extended by that exponential delay (being increased for each retry).ATTENTION: The first call the
nextRetry()
increments the retry countergetRetryCount()
to be 1 and not 0, so the retry counter is actually a "try" counter, having the first "try" upon invokingnextRetry()
.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface org.refcodes.mixin.RetryCountAccessor
org.refcodes.mixin.RetryCountAccessor.RetryCountBuilder<B extends org.refcodes.mixin.RetryCountAccessor.RetryCountBuilder<B>>, org.refcodes.mixin.RetryCountAccessor.RetryCountMutator, org.refcodes.mixin.RetryCountAccessor.RetryCountProperty
-
Nested classes/interfaces inherited from interface org.refcodes.mixin.RetryNumberAccessor
org.refcodes.mixin.RetryNumberAccessor.RetryNumberBuilder<B extends org.refcodes.mixin.RetryNumberAccessor.RetryNumberBuilder<B>>, org.refcodes.mixin.RetryNumberAccessor.RetryNumberMutator, org.refcodes.mixin.RetryNumberAccessor.RetryNumberProperty
-
-
Constructor Summary
Constructors Constructor Description RetryCounter(int aRetryNumber)
Constructs a retry retry counter by providing the number of retries with no delay before each retry.RetryCounter(int aRetryNumber, long aRetryDelayInMs)
Constructs a retry timeout counter by providing the number of retries and the delay before each retry.RetryCounter(int aRetryNumber, long aRetryDelayInMs, long aExpRetryDelayExtensionInMs)
Constructs a retry timeout counter by providing the number of retries and the delay before each retry and taking an exponential delay extension into calculation: ------------------------------------------------------------------------- "(getRetryDelayInMs() + (Math.pow( 4, getRetryCount() - 1 ) * getExpRetryDelayExtensionInMs())" ------------------------------------------------------------------------- In case a delay greater than 0 is set, then each retry is being delayed by the according amount of milliseconds, in case no retries are left, then delaying is skipped.RetryCounter(long aTotalDelayInMs, long aRetryDelayInMs)
Constructs a retry timeout counter by providing the total delay time and the delay before each retry.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
abort()
long
getCurrentRetryDelayInMs()
Returns the current delay before each retry to wait in milliseconds.long
getExpRetryDelayExtensionInMs()
Returns the exponential retry delay extension time in milliseconds.long
getInitialRetryDelayInMs()
Returns the initial delay before each retry to wait in milliseconds.long
getNextRetryDelayInMs()
Calculates the next retry delay in milliseconds.int
getRetryCount()
The current state regarding the retires.int
getRetryNumber()
Returns the number of retires this instance allows altogether.boolean
hasNextRetry()
Returns true in case not all retires have been used up.boolean
nextRetry()
Tests whether a next retry is possible.void
restart()
void
setRetryDelayInMs(long aRetryDelayInMs)
Sets the delay before each retry to wait in milliseconds.
-
-
-
Constructor Detail
-
RetryCounter
public RetryCounter(int aRetryNumber)
Constructs a retry retry counter by providing the number of retries with no delay before each retry.- Parameters:
aRetryNumber
- Sets the number of retires this instance allows altogether
-
RetryCounter
public RetryCounter(long aTotalDelayInMs, long aRetryDelayInMs)
Constructs a retry timeout counter by providing the total delay time and the delay before each retry. The total delay time is the total time thisRetryCounter
will delay till the last call of thenextRetry()
. It does not take the time "lost" into account lost by business logic calling theRetryCounter
. The actual caclultated number of retires may be a rounded one, depending whether the total delay divided by the retry delay has a reminder. Basically speaking this is a convenience constructor callingRetryCounter(int, long, long)
calculating the number of retires by: ------------------------------------------------------------------------- "aRetryNumber = (aTotalDelayInMs / aRetryDelayInMs)" -------------------------------------------------------------------------- Parameters:
aTotalDelayInMs
- Sets the total delay time this instance allows altogether. From this number divided by the actual retry delay results in the number of retires.aRetryDelayInMs
- The delay before each retry to wait in milliseconds. When less than or equal to 0, then the delay is skipped.
-
RetryCounter
public RetryCounter(int aRetryNumber, long aRetryDelayInMs)
Constructs a retry timeout counter by providing the number of retries and the delay before each retry. In case a delay greater than 0 is set, then each retry is being delayed by the according amount of milliseconds, in case no retries are left, then delaying is skipped. A delay of 0 or smaller skips delaying altogether.- Parameters:
aRetryNumber
- Sets the number of retires this instance allows altogether (value of -1 represents an infinite number which can only be aborted viaabort()
).aRetryDelayInMs
- The delay before each retry to wait in milliseconds. When less than or equal to 0, then the delay is skipped.
-
RetryCounter
public RetryCounter(int aRetryNumber, long aRetryDelayInMs, long aExpRetryDelayExtensionInMs)
Constructs a retry timeout counter by providing the number of retries and the delay before each retry and taking an exponential delay extension into calculation: ------------------------------------------------------------------------- "(getRetryDelayInMs() + (Math.pow( 4, getRetryCount() - 1 ) * getExpRetryDelayExtensionInMs())" ------------------------------------------------------------------------- In case a delay greater than 0 is set, then each retry is being delayed by the according amount of milliseconds, in case no retries are left, then delaying is skipped. In case an exponential delay extension is being set greater than 0, then the delay is extended accordingly. A delay of 0 or smaller skips delaying altogether.- Parameters:
aRetryNumber
- Sets the number of retires this instance allows altogetheraRetryDelayInMs
- The delay before each retry to wait in milliseconds. When less than or equal to 0, then the delay is skipped.aExpRetryDelayExtensionInMs
- the exp retry delay extension in ms
-
-
Method Detail
-
nextRetry
public boolean nextRetry()
Tests whether a next retry is possible. In case this is true, then the retry count is incremented by one. In case this is not the first call to the retry counter, then the thread is delayed by the configured delay time. In case ------------------------------------------------------------------------- The first call does not delay as the first call is not considered to be a retry. In case an exponential retry delay extension time has been provided, then the retry delay is extended by that exponential delay being increased for each retry. ------------------------------------------------------------------------- ATTENTION: The first call thenextRetry()
increments the retry countergetRetryCount()
to be 1 and not 0, so the retry counter is actually a "try" counter, having the first "try" upon invokingnextRetry()
. -------------------------------------------------------------------------- Specified by:
nextRetry
in interfaceRetryable
- Returns:
- True in case there is a next retry as of
hasNextRetry()
.
-
getNextRetryDelayInMs
public long getNextRetryDelayInMs()
Calculates the next retry delay in milliseconds. This is the time thenextRetry()
method will wait in case its rules match for doing a sleep.- Returns:
- The next retry delay in milliseconds.
-
hasNextRetry
public boolean hasNextRetry()
Returns true in case not all retires have been used up.- Specified by:
hasNextRetry
in interfaceRetryable
- Returns:
- True in case there are retries left true in case all retries elapsed.
-
restart
public void restart()
- Specified by:
restart
in interfaceorg.refcodes.mixin.Restartable
-
abort
public void abort()
- Specified by:
abort
in interfaceorg.refcodes.mixin.Abortable
-
getRetryNumber
public int getRetryNumber()
Returns the number of retires this instance allows altogether.- Specified by:
getRetryNumber
in interfaceorg.refcodes.mixin.RetryNumberAccessor
- Returns:
- The number of altogether retries.
-
getInitialRetryDelayInMs
public long getInitialRetryDelayInMs()
Returns the initial delay before each retry to wait in milliseconds. ThegetCurrentRetryDelayInMs()
is calculated from the initial delay and the exponential retry delay added for each retry (not added for the first call tonextRetry()
).- Returns:
- The delay to being set in milliseconds.
-
getCurrentRetryDelayInMs
public long getCurrentRetryDelayInMs()
Returns the current delay before each retry to wait in milliseconds. When less than or equal to 0, then the delay is skipped. The current delay is calculated by extending thegetInitialRetryDelayInMs()
with thegetExpRetryDelayExtensionInMs()
per retry. ------------------------------------------------------------------------- The current retry delay gets incremented for each retry by an exponential retry delay extension time calculated from in case it is greater than 0. -------------------------------------------------------------------------- Returns:
- The delay to being set in milliseconds.
-
getExpRetryDelayExtensionInMs
public long getExpRetryDelayExtensionInMs()
Returns the exponential retry delay extension time in milliseconds. In case an exponential retry delay extension time has been provided, then the retry delay upon callingnextRetry()
is extended by that exponential delay (being increased for each retry): ------------------------------------------------------------------------- "(getRetryDelayInMs() + (Math.pow( 4, getRetryCount() - 1 ) * getExpRetryDelayExtensionInMs())" -------------------------------------------------------------------------- Returns:
- The exponential retry delay extension time in milliseconds.
-
getRetryCount
public int getRetryCount()
The current state regarding the retires. It specifies at which retry we currently are. ------------------------------------------------------------------------- ATTENTION: The first call thenextRetry()
increments the retry countergetRetryCount()
to be 1 and not 0, so the retry counter is actually a "try" counter, having the first "try" upon invokingnextRetry()
. -------------------------------------------------------------------------- Specified by:
getRetryCount
in interfaceRetryable
- Specified by:
getRetryCount
in interfaceorg.refcodes.mixin.RetryCountAccessor
- Returns:
- The number of retries used up so far
-
setRetryDelayInMs
public void setRetryDelayInMs(long aRetryDelayInMs)
Sets the delay before each retry to wait in milliseconds. When less than or equal to 0, then the delay is skipped.- Parameters:
aRetryDelayInMs
- The delay to be set in milliseconds.
-
-