com.google.api.client.http
Class ExponentialBackOffPolicy

java.lang.Object
  extended by com.google.api.client.http.ExponentialBackOffPolicy
All Implemented Interfaces:
BackOffPolicy

public class ExponentialBackOffPolicy
extends Object
implements BackOffPolicy

Implementation of BackOffPolicy that increases the back off period for each retry attempt using a randomization function that grows exponentially.

getNextBackOffMillis() is calculated using the following formula:

 randomized_interval =
     retry_interval * (random value in range [1 - randomization_factor, 1 + randomization_factor])
 
In other words getNextBackOffMillis() will range between the randomization factor percentage below and above the retry interval. For example, using 2 seconds as the base retry interval and 0.5 as the randomization factor, the actual back off period used in the next retry attempt will be between 1 and 3 seconds.

Note: max_interval caps the retry_interval and not the randomized_interval.

If the time elapsed since an ExponentialBackOffPolicy instance is created goes past the max_elapsed_time then the method getNextBackOffMillis() starts returning BackOffPolicy.STOP. The elapsed time can be reset by calling reset().

Example: The default retry_interval is .5 seconds, default randomization_factor is 0.5, default multiplier is 1.5 and the default max_interval is 1 minute. For 10 requests the sequence will be (values in seconds) and assuming we go over the max_elapsed_time on the 10th request:

 request#     retry_interval     randomized_interval

 1             0.5                [0.25,   0.75]
 2             0.75               [0.375,  1.125]
 3             1.125              [0.562,  1.687]
 4             1.687              [0.8435, 2.53]
 5             2.53               [1.265,  3.795]
 6             3.795              [1.897,  5.692]
 7             5.692              [2.846,  8.538]
 8             8.538              [4.269, 12.807]
 9            12.807              [6.403, 19.210]
 10           19.210              BackOffPolicy.STOP
 

Implementation is not thread-safe.

Since:
1.7
Author:
Ravi Mistry

Nested Class Summary
static class ExponentialBackOffPolicy.Builder
          Builder for ExponentialBackOffPolicy.
 
Field Summary
static int DEFAULT_INITIAL_INTERVAL_MILLIS
          The default initial interval value in milliseconds (0.5 seconds).
static int DEFAULT_MAX_ELAPSED_TIME_MILLIS
          The default maximum elapsed time in milliseconds (15 minutes).
static int DEFAULT_MAX_INTERVAL_MILLIS
          The default maximum back off time in milliseconds (1 minute).
static double DEFAULT_MULTIPLIER
          The default multiplier value (1.5 which is 50% increase per back off).
static double DEFAULT_RANDOMIZATION_FACTOR
          The default randomization factor (0.5 which results in a random period ranging between 50% below and 50% above the retry interval).
 
Fields inherited from interface com.google.api.client.http.BackOffPolicy
STOP
 
Constructor Summary
ExponentialBackOffPolicy()
          Creates an instance of ExponentialBackOffPolicy using default values.
 
Method Summary
static ExponentialBackOffPolicy.Builder builder()
          Returns an instance of a new builder.
 int getCurrentIntervalMillis()
          Returns the current retry interval in milliseconds.
 long getElapsedTimeMillis()
          Returns the elapsed time in milliseconds since an ExponentialBackOffPolicy instance is created and is reset when reset() is called.
 int getInitialIntervalMillis()
          Returns the initial retry interval in milliseconds.
 int getMaxElapsedTimeMillis()
          Returns the maximum elapsed time in milliseconds.
 int getMaxIntervalMillis()
          Returns the maximum value of the back off period in milliseconds.
 double getMultiplier()
          Returns the value to multiply the current interval with for each retry attempt.
 long getNextBackOffMillis()
          Gets the number of milliseconds to wait before retrying an HTTP request.
 double getRandomizationFactor()
          Returns the randomization factor to use for creating a range around the retry interval.
 boolean isBackOffRequired(int statusCode)
          Determines if back off is required based on the specified status code.
 void reset()
          Sets the interval back to the initial retry interval and restarts the timer.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

DEFAULT_INITIAL_INTERVAL_MILLIS

public static final int DEFAULT_INITIAL_INTERVAL_MILLIS
The default initial interval value in milliseconds (0.5 seconds).

See Also:
Constant Field Values

DEFAULT_RANDOMIZATION_FACTOR

public static final double DEFAULT_RANDOMIZATION_FACTOR
The default randomization factor (0.5 which results in a random period ranging between 50% below and 50% above the retry interval).

See Also:
Constant Field Values

DEFAULT_MULTIPLIER

public static final double DEFAULT_MULTIPLIER
The default multiplier value (1.5 which is 50% increase per back off).

See Also:
Constant Field Values

DEFAULT_MAX_INTERVAL_MILLIS

public static final int DEFAULT_MAX_INTERVAL_MILLIS
The default maximum back off time in milliseconds (1 minute).

See Also:
Constant Field Values

DEFAULT_MAX_ELAPSED_TIME_MILLIS

public static final int DEFAULT_MAX_ELAPSED_TIME_MILLIS
The default maximum elapsed time in milliseconds (15 minutes).

See Also:
Constant Field Values
Constructor Detail

ExponentialBackOffPolicy

public ExponentialBackOffPolicy()
Creates an instance of ExponentialBackOffPolicy using default values. To override the defaults use builder().

Method Detail

isBackOffRequired

public boolean isBackOffRequired(int statusCode)
Determines if back off is required based on the specified status code.

The idea is that the servers are only temporarily unavailable, and they should not be overwhelmed when they are trying to get back up.

The default implementation requires back off for 500 and 503 status codes. Subclasses may override if different status codes are required.

Specified by:
isBackOffRequired in interface BackOffPolicy
Parameters:
statusCode - HTTP status code

reset

public final void reset()
Sets the interval back to the initial retry interval and restarts the timer.

Specified by:
reset in interface BackOffPolicy

getNextBackOffMillis

public long getNextBackOffMillis()
                          throws IOException
Gets the number of milliseconds to wait before retrying an HTTP request. If BackOffPolicy.STOP is returned, no retries should be made.

This method calculates the next back off interval using the formula: randomized_interval = retry_interval +/- (randomization_factor * retry_interval)

Subclasses may override if a different algorithm is required.

Specified by:
getNextBackOffMillis in interface BackOffPolicy
Returns:
the number of milliseconds to wait when backing off requests, or BackOffPolicy.STOP if no more retries should be made
Throws:
IOException

getInitialIntervalMillis

public final int getInitialIntervalMillis()
Returns the initial retry interval in milliseconds.


getRandomizationFactor

public final double getRandomizationFactor()
Returns the randomization factor to use for creating a range around the retry interval.

A randomization factor of 0.5 results in a random period ranging between 50% below and 50% above the retry interval.


getCurrentIntervalMillis

public final int getCurrentIntervalMillis()
Returns the current retry interval in milliseconds.


getMultiplier

public final double getMultiplier()
Returns the value to multiply the current interval with for each retry attempt.


getMaxIntervalMillis

public final int getMaxIntervalMillis()
Returns the maximum value of the back off period in milliseconds. Once the current interval reaches this value it stops increasing.


getMaxElapsedTimeMillis

public final int getMaxElapsedTimeMillis()
Returns the maximum elapsed time in milliseconds.

If the time elapsed since an ExponentialBackOffPolicy instance is created goes past the max_elapsed_time then the method getNextBackOffMillis() starts returning BackOffPolicy.STOP. The elapsed time can be reset by calling reset().


getElapsedTimeMillis

public final long getElapsedTimeMillis()
Returns the elapsed time in milliseconds since an ExponentialBackOffPolicy instance is created and is reset when reset() is called.

The elapsed time is computed using System.nanoTime().


builder

public static ExponentialBackOffPolicy.Builder builder()
Returns an instance of a new builder.



Copyright © 2011-2012 Google. All Rights Reserved.