private void retry ( int attempt , Throwable error , ErrorClassification errorClassification , Context recoveryContext , SettablePromise < T > recoveryResult ) { long backoffTime = _policy . getBackoffPolicy ( ) . nextBackoff ( attempt , error ) ; if ( errorClassification == ErrorClassification . UNRECOVERABLE ) { // For fatal errors there are no retries. LOGGER . debug ( String . format ( "Attempt %s of %s interrupted: %s" , attempt , _name , error . getMessage ( ) ) ) ; recoveryResult . fail ( error ) ; } else if ( _policy . getTerminationPolicy ( ) . shouldTerminate ( attempt , System . currentTimeMillis ( ) - _startedAt + backoffTime ) ) { // Retry policy commands that no more retries should be done. LOGGER . debug ( String . format ( "Too many exceptions after attempt %s of %s, aborting: %s" , attempt , _name , error . getMessage ( ) ) ) ; recoveryResult . fail ( error ) ; } else { // Schedule a new retry task after a computed backoff timeout. LOGGER . debug ( String . format ( "Attempt %s of %s failed and will be retried after %s millis: %s" , attempt , _name , backoffTime , error . getMessage ( ) ) ) ; Task < T > retryTask = wrap ( attempt ) ; Promises . propagateResult ( retryTask , recoveryResult ) ; recoveryContext . createTimer ( backoffTime , TimeUnit . MILLISECONDS , retryTask ) ; } }
Invoke event monitors and schedule a retry if policy allows .