1.先从构建OkHttpClient说起
重点看下ConnectionPool connectionPool = new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.MINUTES);
public class OkHttpUtil {
private static final Logger logger = LoggerFactory.getLogger(OkHttpClient.class);
private static final String MEDIA_TYPE_JSON = "application/json; charset=utf-8";
private static final String CHAR_NULL = "";
private static class OkHttpUtilHolder {
private static final OkHttpUtil INSTANCE = new OkHttpUtil();
}
public static OkHttpUtil getIntance() {
return OkHttpUtilHolder.INSTANCE;
}
private OkHttpUtil() {
}
private static OkHttpClient okHttpClient;
private static boolean okHttpLogSwitch;
static OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
static {
int maxIdleConnections = PropertiesUtil.getProperty(OKHTTP_POOL_MAXIDLECONNECTIONS) != null ? Integer.parseInt(PropertiesUtil.getProperty(OKHTTP_POOL_MAXIDLECONNECTIONS)) : DEFAULT_CLIENT_MAXIDLECONNECTIONS;
long keepAliveDuration = PropertiesUtil.getProperty(OKHTTP_POOL_KEEPALIVEDURATION) != null ? Long.parseLong(PropertiesUtil.getProperty(OKHTTP_POOL_KEEPALIVEDURATION)) : DEFAULT_CLIENT_KEEPALIVEDURATION;
long connectTimeout = PropertiesUtil.getProperty(OKHTTP_CLIENT_CONNECTTIMEOUT) != null ? Long.parseLong(PropertiesUtil.getProperty(OKHTTP_CLIENT_CONNECTTIMEOUT)) : DEFAULT_CLIENT_CONNECTTIMEOUT;
long writeTimeout = PropertiesUtil.getProperty(OKHTTP_CLIENT_WRITETIMEOUT) != null ? Long.parseLong(PropertiesUtil.getProperty(OKHTTP_CLIENT_WRITETIMEOUT)) : DEFAULT_CLIENT_WRITETIMEOUT;
long readTimeout = PropertiesUtil.getProperty(OKHTTP_CLIENT_READTIMEOUT) != null ? Long.parseLong(PropertiesUtil.getProperty(OKHTTP_CLIENT_READTIMEOUT)) : DEFAULT_CLIENT_READTIMEOUT;
int maxRetry = PropertiesUtil.getProperty(OKHTTP_CLIENT_MAXRETRY) != null ? Integer.parseInt(PropertiesUtil.getProperty(OKHTTP_CLIENT_MAXRETRY)) : DEFAULT_CLIENT_MAXRETRY;
okHttpLogSwitch = PropertiesUtil.getProperty(OKHTTP_CLIENT_LOGSWITCH) != null ? Boolean.parseBoolean(PropertiesUtil.getProperty(OKHTTP_CLIENT_LOGSWITCH)) : DEFAULT_CLIENT_LOGSWITCH;
boolean logParamsSwitch = PropertiesUtil.getProperty(OKHTTP_CLIENT_LOGPARAMSSWITCH) != null ? Boolean.parseBoolean(PropertiesUtil.getProperty(OKHTTP_CLIENT_LOGPARAMSSWITCH)) : DEFAULT_CLIENT_LOGSWITCH;
boolean enableHttps = PropertiesUtil.getProperty(OKHTTP_CLIENT_ENABLEHTTPS) != null ? Boolean.parseBoolean(PropertiesUtil.getProperty(OKHTTP_CLIENT_ENABLEHTTPS)) : DEFAULT_CLIENT_ENABLEHTTPS;
String timeUnit = PropertiesUtil.getProperty(OKHTTP_CLIENT_TIMEUNIT);
ConnectionPool connectionPool = new ConnectionPool(maxIdleConnections, keepAliveDuration, TimeUnit.MINUTES);
builder.connectionPool(connectionPool)
.retryOnConnectionFailure(true)
.addInterceptor(new RetryIntercepter(maxRetry, okHttpLogSwitch, logParamsSwitch));
if (timeUnit != null && timeUnit.equals(DEFAULT_CLIENT_TIMEUNIT_MS)) {
builder.connectTimeout(connectTimeout, TimeUnit.MILLISECONDS)
.writeTimeout(writeTimeout, TimeUnit.MILLISECONDS)
.readTimeout(readTimeout, TimeUnit.MILLISECONDS);
} else {
builder.connectTimeout(connectTimeout, TimeUnit.SECONDS)
.writeTimeout(writeTimeout, TimeUnit.SECONDS)
.readTimeout(readTimeout, TimeUnit.SECONDS);
}
if (enableHttps) {
trustAllHosts();//璁剧疆蹇界暐瀹夊叏璇佷功楠岃瘉
// 瀹炵幇HostnameVerifier鎺ュ彛锛屼笉杩涜url鍜屾湇鍔″櫒涓绘満鍚嶇殑楠岃瘉銆�
builder.hostnameVerifier(new HostnameVerifier() {
@Override
public boolean verify(String hostname, SSLSession session) {
return true;
}
});
}
okHttpClient = builder.build();
}
public OkResponseResult doGet(OkHttpRequest okHttpRequest) {
Headers.Builder headerBuilder = buildHeaders(okHttpRequest.headerParams(), okHttpRequest.retryTimes(), okHttpRequest.reqLogIgnore());
long startNanoTime = nanoTime();
boolean success = true;
String tag = swapTag(okHttpRequest.tag());
Request request = new Request.Builder().headers(headerBuilder.build()).url(okHttpRequest.url()).tag(tag).build();
Call call = okHttpClient.newCall(request);
Response execute = null;
try {
execute = call.execute();
if (execute != null && execute.isSuccessful()) {
return OkResponseResult.buildSuccessResponse(execute);
}
success = false;
return OkResponseResult.buildFaliureResponse(execute);
} catch (Exception e) {
logger.error(GET_ERROR_MSG, e);
if (execute != null && execute.body() != null) {
execute.body().close();
}
success = false;
return OkResponseResult.buildIOExceptionResponse();
} finally {
long micros = NANOSECONDS.toMicros(nanoTime() - startNanoTime);
PerfUtils.perf(success ? "http.success" : "http.fail", getBizName(), getIdentity(okHttpRequest))
.micros(micros)
.logstashOnly();
}
}
}
2.RealCall类是OkHttp的核心类
Call call = okHttpClient.newCall(request);
execute = call.execute();
final class RealCall implements Call {
final OkHttpClient client;
final RetryAndFollowUpInterceptor retryAndFollowUpInterceptor;
/**
* There is a cycle between the {@link Call} and {@link EventListener} that makes this awkward.
* This will be set after we create the call instance then create the event listener instance.
*/
private EventListener eventListener;
/** The application's original request unadulterated by redirects or auth headers. */
final Request originalRequest;
final boolean forWebSocket;
// Guarded by this.
private boolean executed;
private RealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) {
this.client = client;
this.originalRequest = originalRequest;
this.forWebSocket = forWebSocket;
this.retryAndFollowUpInterceptor = new RetryAndFollowUpInterceptor(client, forWebSocket);
}
static RealCall newRealCall(OkHttpClient client, Request originalRequest, boolean forWebSocket) {
// Safely publish the Call instance to the EventListener.
RealCall call = new RealCall(client, originalRequest, forWebSocket);
call.eventListener = client.eventListenerFactory().create(call);
return call;
}
@Override public Request request()