package com.linkedin.parseq.retry; import com.linkedin.parseq.retry.backoff.BackoffPolicy; import com.linkedin.parseq.retry.termination.RequireEither; import com.linkedin.parseq.retry.termination.TerminationPolicy; import java.util.function.Function; /** * An interface for policies that enable customizable retries for arbitrary parseq tasks. * * @author Oleg Anashkin (oleg.anashkin@gmail.com) */ public interface RetryPolicy { /** * @return The name of this policy. It is used to configure parseq tasks. */ String getName(); /** * @return The strategy for determining when to abort a retry operation. */ TerminationPolicy getTerminationPolicy(); /** * @return The strategy used to calculate delays between retries. */ BackoffPolicy getBackoffPolicy(); /** * @return The classifier for errors raised during retry operations. */ Function<Throwable, ErrorClassification> getErrorClassifier(); /** * Retry policy with configurable number of attempts. * * @param attempts Total number of attempts (the number of retries will be that minus 1). * @param backoff The constant delay (in milliseconds) between retry attempts. */ static RetryPolicy attempts(int attempts, long backoff) { return new RetryPolicyBuilder(). setTerminationPolicy(TerminationPolicy.limitAttempts(attempts)). setBackoffPolicy(BackoffPolicy.constant(backoff)). build(); } /** * Retry policy with limited total duration of the encompassing task (including unlimited retries). * * @param duration Total duration of the task. This includes both the original request and all potential retries. * @param backoff The constant delay (in milliseconds) between retry attempts. */ static RetryPolicy duration(long duration, long backoff) { return new RetryPolicyBuilder(). setTerminationPolicy(TerminationPolicy.limitDuration(duration)). setBackoffPolicy(BackoffPolicy.constant(backoff)). build(); } /** * Retry policy with configurable number of retries and limited total duration of the encompassing task. * * @param attempts Total number of attempts (the number of retries will be that minus 1). * @param duration Total duration of the task. This includes both the original request and all potential retries. * @param backoff The constant delay (in milliseconds) between retry attempts. */ static RetryPolicy attemptsAndDuration(int attempts, long duration, long backoff) { TerminationPolicy terminationPolicy = new RequireEither(TerminationPolicy.limitAttempts(attempts), TerminationPolicy.limitDuration(duration)); return new RetryPolicyBuilder(). setName("RetryPolicy.LimitAttemptsAndDuration"). setTerminationPolicy(terminationPolicy). setBackoffPolicy(BackoffPolicy.constant(backoff)). build(); } }