com.rt.storage.api.client.http.HttpBackOffIOExceptionHandler Maven / Gradle / Ivy
package com.rt.storage.api.client.http;
import com.rt.storage.api.client.util.BackOff;
import com.rt.storage.api.client.util.BackOffUtils;
import com.rt.storage.api.client.util.Beta;
import com.rt.storage.api.client.util.Preconditions;
import com.rt.storage.api.client.util.Sleeper;
import java.io.IOException;
/**
* {@link Beta}
* {@link HttpIOExceptionHandler} implementation with {@link BackOff}.
*
* It is designed to work with only one {@link HttpRequest} at a time. As a result you MUST
* create a new instance of {@link HttpBackOffIOExceptionHandler} with a new instance of {@link
* BackOff} for each instance of {@link HttpRequest}.
*
*
Sample usage:
*
*
* request.setIOExceptionHandler(new HttpBackOffIOExceptionHandler(new ExponentialBackOff());
*
*
* Note: Implementation doesn't call {@link BackOff#reset} at all, since it expects a new {@link
* BackOff} instance.
*
*
Implementation is not thread-safe
*
* @author Eyal Peled
* @since 1.15
*/
@Beta
public class HttpBackOffIOExceptionHandler implements HttpIOExceptionHandler {
/** Back-off policy. */
private final BackOff backOff;
/** Sleeper. */
private Sleeper sleeper = Sleeper.DEFAULT;
/**
* Constructs a new instance from a {@link BackOff}.
*
* @param backOff back-off policy
*/
public HttpBackOffIOExceptionHandler(BackOff backOff) {
this.backOff = Preconditions.checkNotNull(backOff);
}
/** Returns the back-off. */
public final BackOff getBackOff() {
return backOff;
}
/** Returns the sleeper. */
public final Sleeper getSleeper() {
return sleeper;
}
/**
* Sets the sleeper.
*
*
The default value is {@link Sleeper#DEFAULT}.
*
*
Overriding is only supported for the purpose of calling the super implementation and
* changing the return type, but nothing else.
*/
public HttpBackOffIOExceptionHandler setSleeper(Sleeper sleeper) {
this.sleeper = Preconditions.checkNotNull(sleeper);
return this;
}
/**
* {@inheritDoc}
*
*
Handles the request with {@link BackOff}. That means that if back-off is required a call to
* {@link Sleeper#sleep(long)} will be made.
*/
public boolean handleIOException(HttpRequest request, boolean supportsRetry) throws IOException {
if (!supportsRetry) {
return false;
}
try {
return BackOffUtils.next(sleeper, backOff);
} catch (InterruptedException exception) {
// Mark thread as interrupted since we cannot throw InterruptedException here.
Thread.currentThread().interrupt();
return false;
}
}
}