All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.datarouter.httpclient.client.DatarouterServiceUnavailableRetryStrategy Maven / Gradle / Ivy

There is a newer version: 0.0.126
Show newest version
/**
 * Copyright © 2009 HotPads ([email protected])
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package io.datarouter.httpclient.client;

import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ServiceUnavailableRetryStrategy;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.protocol.HttpContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import io.datarouter.httpclient.circuitbreaker.DatarouterHttpClientIoExceptionCircuitBreaker;
import io.datarouter.httpclient.response.HttpStatusCode;
import io.datarouter.instrumentation.trace.TracerTool;

public class DatarouterServiceUnavailableRetryStrategy implements ServiceUnavailableRetryStrategy{
	private static final Logger logger = LoggerFactory.getLogger(DatarouterServiceUnavailableRetryStrategy.class);

	private static final Set STATUS_CODES_TO_RETRY = Stream.of(
			HttpStatusCode.SC_502_BAD_GATEWAY,
			HttpStatusCode.SC_503_SERVICE_UNAVAILABLE,
			HttpStatusCode.SC_504_GATEWAY_TIMEOUT)
			.map(HttpStatusCode::getStatusCode)
			.collect(Collectors.toSet());

	private final Supplier retryCount;

	public DatarouterServiceUnavailableRetryStrategy(Supplier retryCount){
		this.retryCount = retryCount;
	}

	@Override
	public boolean retryRequest(HttpResponse response, int executionCount, HttpContext context){
		int statusCode = response.getStatusLine().getStatusCode();
		if(!STATUS_CODES_TO_RETRY.contains(statusCode)){
			return false;
		}
		HttpClientContext clientContext = HttpClientContext.adapt(context);
		boolean willRetry = HttpRetryTool.shouldRetry(context, executionCount, retryCount);
		String requestId = (String)context.getAttribute(DatarouterHttpClientIoExceptionCircuitBreaker.X_REQUEST_ID);
		String url = clientContext.getTargetHost() + clientContext.getRequest().getRequestLine().getUri();
		if(willRetry){
			HttpEntity httpEntity = response.getEntity();
			String entity = HttpRetryTool.tryEntityToString(httpEntity);
			logger.warn("failure target={} id={} failureCount={} statusCode={} entity={}", url, requestId,
					executionCount, statusCode, entity);
			TracerTool.appendToSpanInfo("willRetry", statusCode);
		}else{
			// don't log everything, caller will get details in an Exception
			logger.warn("failure target={} id={} failureCount={} statusCode={} (final)", url, requestId, executionCount,
					statusCode);
		}
		return willRetry;
	}

	@Override
	public long getRetryInterval(){
		return 0;
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy