@@ -57,6 +57,8 @@ public final class QCloudHttpClient {
5757 // private NetworkClient networkClient;
5858 private String networkClientType = OkHttpClientImpl .class .getName ();
5959 private static Map <Integer , NetworkClient > networkClientMap = new ConcurrentHashMap <>(2 );
60+ private static OkHttpClient .Builder okHttpClientBuilder ;
61+ private OkHttpClientImpl okhttpNetworkClient ;
6062 private final TaskManager taskManager ;
6163 private final HttpLogger httpLogger ;
6264
@@ -214,10 +216,17 @@ private QCloudHttpClient(Builder b) {
214216 networkClient = new OkHttpClientImpl ();
215217 }
216218 networkClientType = networkClient .getClass ().getName ();
217- int hashCode = networkClientType .hashCode ();
218- if (!networkClientMap .containsKey (hashCode )){
219- networkClient .init (b , hostnameVerifier (), mDns , httpLogger );
220- networkClientMap .put (hashCode , networkClient );
219+ if (OkHttpClientImpl .class .getName ().equals (networkClientType ) && networkClient instanceof OkHttpClientImpl ){
220+ // 如果是默认的okhttp 则不缓存 支持外部各service不同配置
221+ this .okhttpNetworkClient = (OkHttpClientImpl ) networkClient ;
222+ this .okhttpNetworkClient .init (b , hostnameVerifier (), mDns , httpLogger );
223+ } else {
224+ // 如果不是okhttp,例如quic,由于资源消耗问题,进行缓存,不支持外部各service不同配置
225+ int hashCode = networkClientType .hashCode ();
226+ if (!networkClientMap .containsKey (hashCode )){
227+ networkClient .init (b , hostnameVerifier (), mDns , httpLogger );
228+ networkClientMap .put (hashCode , networkClient );
229+ }
221230 }
222231 connectionRepository .addPrefetchHosts (b .prefetchHost );
223232 connectionRepository .init (); // 启动 dns 缓存
@@ -226,13 +235,19 @@ private QCloudHttpClient(Builder b) {
226235 public void setNetworkClientType (Builder b ){
227236 NetworkClient networkClient = b .networkClient ;
228237 if (networkClient != null ){
229- String name = networkClient .getClass ().getName ();
230- int hashCode = name .hashCode ();
231- if (!networkClientMap .containsKey (hashCode )){
232- networkClient .init (b , hostnameVerifier (), mDns , httpLogger );
233- networkClientMap .put (hashCode , networkClient );
238+ networkClientType = networkClient .getClass ().getName ();
239+ if (OkHttpClientImpl .class .getName ().equals (networkClientType ) && networkClient instanceof OkHttpClientImpl ){
240+ // 如果是默认的okhttp 则不缓存 支持外部各service不同配置
241+ this .okhttpNetworkClient = (OkHttpClientImpl ) networkClient ;
242+ this .okhttpNetworkClient .init (b , hostnameVerifier (), mDns , httpLogger );
243+ } else {
244+ // 如果不是okhttp,例如quic,由于资源消耗问题,进行缓存,不支持外部各service不同配置
245+ int hashCode = networkClientType .hashCode ();
246+ if (!networkClientMap .containsKey (hashCode )){
247+ networkClient .init (b , hostnameVerifier (), mDns , httpLogger );
248+ networkClientMap .put (hashCode , networkClient );
249+ }
234250 }
235- this .networkClientType = name ;
236251 }
237252 }
238253
@@ -268,7 +283,11 @@ private HostnameVerifier hostnameVerifier() {
268283
269284 private <T > HttpTask <T > handleRequest (HttpRequest <T > request ,
270285 QCloudCredentialProvider credentialProvider ) {
271- return new HttpTask <T >(request , credentialProvider , networkClientMap .get (networkClientType .hashCode ()));
286+ if (OkHttpClientImpl .class .getName ().equals (networkClientType )){
287+ return new HttpTask <T >(request , credentialProvider , this .okhttpNetworkClient );
288+ } else {
289+ return new HttpTask <T >(request , credentialProvider , networkClientMap .get (networkClientType .hashCode ()));
290+ }
272291 }
273292
274293 /**
@@ -357,7 +376,11 @@ public QCloudHttpClient build() {
357376 retryStrategy .setRetryHandler (qCloudHttpRetryHandler );
358377 }
359378 if (mBuilder == null ) {
360- mBuilder = new OkHttpClient .Builder ();
379+ // 复用okhttp底层资源(线程池、连接池等)
380+ if (QCloudHttpClient .okHttpClientBuilder == null ){
381+ QCloudHttpClient .okHttpClientBuilder = new OkHttpClient .Builder ();
382+ }
383+ mBuilder = QCloudHttpClient .okHttpClientBuilder ;
361384 }
362385
363386 return new QCloudHttpClient (this );
0 commit comments