public Options mergeFrom(Options other) { Preconditions.checkNotNull(other); Options merged = new Options(); merged.maxRetries = other.maxRetries.or(maxRetries); merged.initialRetryBackoffSeconds = other.initialRetryBackoffSeconds.or(initialRetryBackoffSeconds); merged.maxRetryBackoffSeconds = other.maxRetryBackoffSeconds.or(maxRetryBackoffSeconds); merged.retryStrategy = other.retryStrategy.or(retryStrategy); return merged; } }
private boolean retriesRemaining() { return currentRetries.get() < options.getMaxRetries(); }
private HttpResponse executeWithRetries(HttpRequest request, Options options, int retries) throws IOException { int maxRetries = options.getMaxRetries(); RetryStrategy retryStrategy = options.getRetryStrategy();
private ListenableFuture<HttpResponse> internalExecute(HttpRequest request, Options options, Callback callback) { Preconditions.checkNotNull(request); Preconditions.checkNotNull(options); Preconditions.checkNotNull(callback); NingRetryHandler retryHandler = new NingRetryHandler(defaultOptions.mergeFrom(options)); NingFuture future = new NingFuture(callback); final NingCompletionHandler completionHandler = new NingCompletionHandler(request, future, retryHandler, mapper); final Request ningRequest = requestConverter.convert(request); Runnable runnable = new Runnable() { @Override public void run() { try { ningClient.executeRequest(ningRequest, completionHandler); } catch (RuntimeException e) { completionHandler.onThrowable(e); } } }; retryHandler.setRetryRunnable(runnable); runnable.run(); return future; }
@Override public boolean shouldRetry(HttpRequest request, IOException exception) { return retriesRemaining() && options.getRetryStrategy().shouldRetry(request, exception); }
public Builder setInitialRetryBackoffSeconds(int initialRetryBackoffSeconds) { options.setInitialRetryBackoffSeconds(initialRetryBackoffSeconds); return this; }
public Builder setMaxRetries(int maxRetries) { options.setMaxRetries(maxRetries); return this; }
@Override public boolean shouldRetry(HttpRequest request, HttpResponse response) { return retriesRemaining() && options.getRetryStrategy().shouldRetry(request, response); }
public Builder setRetryStrategy(RetryStrategy retryStrategy) { options.setRetryStrategy(Preconditions.checkNotNull(retryStrategy)); return this; }
public Builder setMaxRetryBackoffSeconds(int maxRetryBackoffSeconds) { options.setMaxRetryBackoffSeconds(maxRetryBackoffSeconds); return this; }
public Options getOptions() { Options options = new Options(); options.setMaxRetries(maxRetries); options.setInitialRetryBackoffSeconds(initialRetryBackoffSeconds); options.setMaxRetryBackoffSeconds(maxRetryBackoffSeconds); options.setRetryStrategy(retryStrategy); return options; }
@Override public HttpResponse execute(HttpRequest request, Options options) throws HttpRuntimeException { Preconditions.checkNotNull(request); Preconditions.checkNotNull(options); try { return executeWithRetries(request, defaultOptions.mergeFrom(options), 0); } catch (Exception e) { Throwables.propagateIfInstanceOf(e, HttpRuntimeException.class); throw new HttpRuntimeException(e); } }
public static int computeBackoff(Options options, int retries) { int initialBackoff = options.getInitialRetryBackoffMillis(); int computedBackoff = nextInt(initialBackoff / 4) + (initialBackoff * retries * retries); return Math.min(computedBackoff, options.getMaxRetryBackoffMillis()); }
private HttpResponse getFromMesos(String uri, boolean useShortTimeout) { HttpClient currentHttpClient = useShortTimeout ? shortTimeoutHttpClient : httpClient; HttpResponse response = null; final long start = System.currentTimeMillis(); LOG.debug("Fetching {} from mesos", uri); try { response = currentHttpClient.execute(HttpRequest.newBuilder().setUrl(uri).build(), new Options()); LOG.debug("Response {} - {} after {}", response.getStatusCode(), uri, JavaUtils.duration(start)); } catch (Exception e) { throw new MesosClientException(String.format("Exception fetching %s after %s", uri, JavaUtils.duration(start)), e); } if (!response.isSuccess()) { throw new MesosClientException(String.format("Invalid response code from %s : %s", uri, response.getStatusCode())); } return response; }