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

com.alibaba.dashscope.protocol.okhttp.OkHttpClientFactory Maven / Gradle / Ivy

The newest version!
// Copyright (c) Alibaba, Inc. and its affiliates.

package com.alibaba.dashscope.protocol.okhttp;

import com.alibaba.dashscope.protocol.ClientOptions;
import com.alibaba.dashscope.protocol.ConnectionConfigurations;
import com.alibaba.dashscope.protocol.ConnectionOptions;
import com.alibaba.dashscope.utils.Constants;
import java.util.Collections;
import java.util.concurrent.TimeUnit;
import lombok.extern.slf4j.Slf4j;
import okhttp3.ConnectionPool;
import okhttp3.Dispatcher;
import okhttp3.OkHttpClient;
import okhttp3.OkHttpClient.Builder;
import okhttp3.Protocol;
import okhttp3.logging.HttpLoggingInterceptor;
import okhttp3.logging.HttpLoggingInterceptor.Level;

@Slf4j
public class OkHttpClientFactory {
  private OkHttpClientFactory() {
    if (Holder.INSTANCE != null) {
      throw new IllegalStateException();
    }
  }

  private static class Holder {
    private static final OkHttpClient INSTANCE = createInstance();

    private static OkHttpClient createInstance() {
      ConnectionConfigurations connectionConfigurations = Constants.connectionConfigurations;
      if (connectionConfigurations == null) {
        // build default configuration
        connectionConfigurations = ConnectionConfigurations.builder().build();
      }

      ClientOptions defaultOptions = ClientOptions.builder().build();
      HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
      logging.setLevel(Level.valueOf(defaultOptions.getNetworkLoggingLevel()));
      int connectionPoolSize = connectionConfigurations.getConnectionPoolSize();
      log.debug("[connectionPool Config] connectionPoolSize: {}", connectionPoolSize);
      Dispatcher dispatcher = new Dispatcher();
      dispatcher.setMaxRequests(connectionConfigurations.getMaximumAsyncRequests());
      log.debug("[connectionPool Config] maxRequests: {}", dispatcher.getMaxRequests());
      dispatcher.setMaxRequestsPerHost(connectionConfigurations.getMaximumAsyncRequestsPerHost());
      log.debug(
          "[connectionPool Config] maxRequestsPerHost: {}", dispatcher.getMaxRequestsPerHost());
      Builder clientBuilder = new OkHttpClient.Builder();
      clientBuilder
          .connectTimeout(connectionConfigurations.getConnectTimeout())
          .readTimeout(connectionConfigurations.getReadTimeout())
          .writeTimeout(connectionConfigurations.getWriteTimeout())
          .addInterceptor(logging)
          .dispatcher(dispatcher)
          .protocols(Collections.singletonList(Protocol.HTTP_1_1))
          .connectionPool(
              new ConnectionPool(
                  connectionPoolSize,
                  connectionConfigurations.getConnectionIdleTimeout().getSeconds(),
                  TimeUnit.SECONDS));
      if (connectionConfigurations.getProxy() != null) {
        clientBuilder.proxy(connectionConfigurations.getProxy());
      }
      if (connectionConfigurations.getProxyAuthenticator() != null) {
        clientBuilder.proxyAuthenticator(connectionConfigurations.getProxyAuthenticator());
      }
      return clientBuilder.build();
    }
  }

  public static OkHttpClient getOkHttpClient() {
    /** Use default http client pool. */
    return Holder.INSTANCE;
  }

  public static OkHttpClient getNewOkHttpClient(ConnectionOptions connectionOptions) {
    return Holder.INSTANCE
        .newBuilder()
        .connectTimeout(connectionOptions.getConnectTimeout())
        .readTimeout(connectionOptions.getReadTimeout())
        .writeTimeout(connectionOptions.getWriteTimeout())
        .build();
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy