代理下使用 HTTPClient 4.5 的 Resttemplate 连接超时

2024-03-16

如何设置超时时间?我已经设置了几乎所有的超时配置。通常没有代理就可以正常工作。当我使用代理连接详细信息进行连接时,会出现问题。日志显示正在连接,但未收到回复。

2020-03-04 19:53:39,751 DEBUG [main] org.springframework.core.log.CompositeLog: HTTP POST https://destinationurl.io/api/agentmanagement/v3/oauth/token
2020-03-04 19:53:39,803 DEBUG [main] org.springframework.core.log.CompositeLog: Accept=[application/json, application/*+json]
2020-03-04 19:53:39,807 DEBUG [main] org.springframework.core.log.CompositeLog: Writing [grant_type=client_credentials&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion=token--cjKRDhVI0OuYo] as "application/x-www-form-urlencoded"
2020-03-04 19:53:39,821 DEBUG [main] org.apache.http.client.protocol.RequestAuthCache: Auth cache not set in the context
2020-03-04 19:53:39,823 DEBUG [main] org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Connection request: [route: {tls}->http://proxyurl:3128->https://destinationurl.io:443][total kept alive: 0; route allocated: 0 of 20; total allocated: 0 of 100]
2020-03-04 19:53:39,838 DEBUG [main] org.apache.http.impl.conn.PoolingHttpClientConnectionManager: Connection leased: [id: 0][route: {tls}->http://proxyurl:3128->https://destinationurl.io:443][total kept alive: 0; route allocated: 1 of 20; total allocated: 1 of 100]
2020-03-04 19:53:39,839 DEBUG [main] org.apache.http.impl.execchain.MainClientExec: Opening connection {tls}->http://proxyurl:3128->https://destinationurl.io:443
2020-03-04 19:53:40,047 DEBUG [main] org.apache.http.impl.conn.DefaultHttpClientConnectionOperator: Connecting to proxyurl/35.158.73.29:3128
2020-03-04 19:53:40,420 DEBUG [main] org.apache.http.impl.conn.DefaultHttpClientConnectionOperator: Connection established 132.186.74.92:65173<->35.158.73.29:3128
2020-03-04 19:53:40,423 DEBUG [main] org.apache.http.impl.conn.LoggingManagedHttpClientConnection: http-outgoing-0 >> CONNECT destinationurl.io:443 HTTP/1.1
2020-03-04 19:53:40,424 DEBUG [main] org.apache.http.impl.conn.LoggingManagedHttpClientConnection: http-outgoing-0 >> Host: destinationurl.io
2020-03-04 19:53:40,424 DEBUG [main] org.apache.http.impl.conn.LoggingManagedHttpClientConnection: http-outgoing-0 >> User-Agent: Apache-HttpClient/4.5.10 (Java/1.8.0_201)
2020-03-04 19:53:40,424 DEBUG [main] org.apache.http.impl.conn.Wire: http-outgoing-0 >> "CONNECT destinationurl.io:443 HTTP/1.1[\r][\n]"
2020-03-04 19:53:40,424 DEBUG [main] org.apache.http.impl.conn.Wire: http-outgoing-0 >> "Host: destinationurl.io[\r][\n]"
2020-03-04 19:53:40,424 DEBUG [main] org.apache.http.impl.conn.Wire: http-outgoing-0 >> "User-Agent: Apache-HttpClient/4.5.10 (Java/1.8.0_201)[\r][\n]"
2020-03-04 19:53:40,424 DEBUG [main] org.apache.http.impl.conn.Wire: http-outgoing-0 >> "[\r][\n]"

日志附后。

    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.11</version>
    </dependency>

这是我的配置。我正在使用 Spring Boot 2.2。

PoolingHttpClientConnectionManager connectionManager;
if (properties.isAllCertificateAllowed()) {
  connectionManager =
          new PoolingHttpClientConnectionManager(
                  buildSocketFactoryRegistry(trustAllSslConnectionSocketFactory(trustAllSslContext())));
} else {
  connectionManager = new PoolingHttpClientConnectionManager();
}

RequestConfig config = RequestConfig.custom()
        .setSocketTimeout(properties.getConnectTimeout())
        .setConnectTimeout(properties.getConnectTimeout())
        .setConnectionRequestTimeout(properties.getConnectTimeout())
        .build();

/* HttpClientBuilder using http client connection connectionManager */
HttpClientBuilder httpClientBuilder =
        HttpClientBuilder.create()
                .setConnectionManager(connectionManager)
                .useSystemProperties()
                .disableCookieManagement()
                .setDefaultRequestConfig(config);

HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
httpRequestFactory.setConnectTimeout(properties.getConnectTimeout()) ;
httpRequestFactory.setReadTimeout(properties.getReadTimeout());
httpRequestFactory.setConnectionRequestTimeout(properties.getConnectionRequestTimeout());

if (properties.isProxyEnabled()) {
  log.info(properties.toString());

  /* proxy username ,password name setting */
  CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
  credentialsProvider.setCredentials(
          new AuthScope(properties.getProxyAddress(), properties.getProxyPort()),
          new UsernamePasswordCredentials(
                  properties.getProxyUsername(), properties.getProxyPassword()));

  httpClientBuilder.setProxy(
          new HttpHost(properties.getProxyAddress(), properties.getProxyPort())); //TODO,"https"
  httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);

  CloseableHttpClient httpClient = httpClientBuilder.build();
  httpRequestFactory.setHttpClient(httpClient);
}
RestTemplate restTemplate = new RestTemplate(httpRequestFactory);

看来是代理问题。应使用给定的代理详细信息检查代理配置的 HTTP/HTTPS 架构。您可以在创建restTemplate 时提供信任所有证书的选项。请参阅下面的示例以信任所有证书:-

参考:Spring RestTemplate 连接超时不起作用 https://stackoverflow.com/questions/43909219/spring-resttemplate-connection-timeout-is-not-working

示例代码:-

@Bean
public RestTemplate restTemplate(AgentManagementProperties properties) {
    PoolingHttpClientConnectionManager connectionManager;
    if (properties.isAllCertificateAllowed()) {
      connectionManager =
          new PoolingHttpClientConnectionManager(
              buildSocketFactoryRegistry(trustAllSslConnectionSocketFactory(trustAllSslContext())));
    } else {
      connectionManager = new PoolingHttpClientConnectionManager();
    }
    connectionManager.setMaxTotal(properties.getMaxPooledHttpConnections());
    connectionManager.setDefaultMaxPerRoute(properties.getMaxHttpConnectionsPerRoute());

    RequestConfig config =
        RequestConfig.custom()
            .setSocketTimeout(properties.getConnectTimeout())
            .setConnectTimeout(properties.getConnectTimeout())
            .setConnectionRequestTimeout(properties.getConnectTimeout())
            .build();

    /* HttpClientBuilder using http client connection connectionManager */
    HttpClientBuilder httpClientBuilder =
        HttpClientBuilder.create()
            .setConnectionManager(connectionManager)
            .useSystemProperties()
            .disableCookieManagement()
            .setDefaultRequestConfig(config);

    HttpComponentsClientHttpRequestFactory httpRequestFactory =
        new HttpComponentsClientHttpRequestFactory();
    httpRequestFactory.setConnectTimeout(properties.getConnectTimeout());
    httpRequestFactory.setReadTimeout(properties.getReadTimeout());
    httpRequestFactory.setConnectionRequestTimeout(properties.getConnectionRequestTimeout());

    if (properties.isProxyEnabled()) {
      // proxy username and password setting
      CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
      credentialsProvider.setCredentials(
          new AuthScope(properties.getProxyAddress(), properties.getProxyPort()),
          new UsernamePasswordCredentials(
              properties.getProxyUsername(), properties.getProxyPassword()));
      // proxy url, port and schema setting
      httpClientBuilder.setProxy(
          new HttpHost(
              properties.getProxyAddress(),
              properties.getProxyPort(),
              properties.getProxySchema()));
      httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);

      CloseableHttpClient httpClient = httpClientBuilder.build();
      httpRequestFactory.setHttpClient(httpClient);
    }
    return new RestTemplate(httpRequestFactory);
  }

  private static Registry<ConnectionSocketFactory> buildSocketFactoryRegistry(
      SSLConnectionSocketFactory sslConnectionSocketFactory) {
    return RegistryBuilder.<ConnectionSocketFactory>create()
        .register("http", new PlainConnectionSocketFactory())
        .register("https", sslConnectionSocketFactory)
        .build();
  }

  private static SSLConnectionSocketFactory trustAllSslConnectionSocketFactory(
      SSLContext sslContext) {
    return new SSLConnectionSocketFactory(sslContext);
  }

  private static SSLContext trustAllSslContext() {
    SSLContext sslContext = null;
    try {
      sslContext = SSLContext.getInstance("TLS");
      sslContext.init(
          null,
          new TrustManager[] {
            new X509TrustManager() {
              public void checkClientTrusted(X509Certificate[] arg0, String arg1) {
                // NOT IMPLEMENTED Please refer SDK Core
              }

              public void checkServerTrusted(X509Certificate[] arg0, String arg1) {
                // NOT IMPLEMENTED Please refer SDK Core
              }

              public X509Certificate[] getAcceptedIssuers() {
                return new X509Certificate[0];
              }
            }
          },
          new SecureRandom());
    } catch (KeyManagementException | NoSuchAlgorithmException e) {
      String errorMessage = "An error occured while configuring ssl context: {}";
      log.error(errorMessage, e);
    }
    return sslContext;
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

代理下使用 HTTPClient 4.5 的 Resttemplate 连接超时 的相关文章

随机推荐

  • BFG Repo Cleaner的正确使用方法

    The BFG 回购清理器 https rtyley github io bfg repo cleaner 网站给出了使用该工具清理存储库的示例 如下所示 克隆您的存储库的新副本 git clone mirror git example c
  • 模块化、基于组件的 Sinatra 应用程序的架构

    我正在开发一个 Sinatra 应用程序 其中包含大约 10 个不同的功能组件 我们希望能够将这些组件混合并匹配到应用程序的单独实例中 完全通过 config yaml 文件进行配置 如下所示 components route chunky
  • 同一表中的 MySQL 计数,包括零计数值

    我有这个带有数据的表结构 INSERT INTO test id email id user ref name VALUES 1 email protected cdn cgi l email protection NULL Mike 2
  • Ember.js 渲染大型列表而不锁定浏览器

    当需要在客户端渲染大量项目时 我对 Ember js 有哪些选择 分页是一种减少渲染时间的明显方法 但是还有其他技巧可以让您渲染一个大的项目列表 而不会在 JavaScript 执行时出现明显的浏览器冻结吗 ember 列表视图 https
  • CakePHP 和子查询

    如何使用 cake 语法编写 SQL 子查询 我知道如何编写简单的查询 但无法处理子查询 这是原始查询 SELECT Assumption id Referee id Referee first name Referee second na
  • TFIDF 矢量器给出错误

    我正在尝试使用 TFIDF 和 SVM 对某些文件进行文本分类 一次要选择 3 个单词的特征 我的数据文件已经采用以下格式 天使之眼 每一个都有其自己的 没有停用词 也不能进行旅鼠或词干提取 我希望该功能被选择为 天使眼有 我编写的代码如下
  • 将各种类型的函数应用于值

    假设我有一个方法将多个函数应用于一个值 用法示例 String value a string with numb3r5 Function
  • CSS:Helvetica 是 Mac 上默认的“无衬线”字体,Arial 是 Windows 上默认的无衬线字体吗?

    我有很多 CSS 可以执行以下操作 font family Helvetica Arial sans serif 据我了解 Helvetica 是 Mac 上的默认无衬线字体 Arial 是 Windows 上的默认无衬线字体 如果是这样的
  • Spring Boot Actuator Endpoints 安全性不适用于自定义 Spring Security 配置

    这是我的 Spring Boot 1 5 1 执行器application properties Spring Boot Actuator management contextPath actuator management securit
  • web2py - 如何注入 html

    我使用 rows xml 生成 html 输出 我想知道如何向生成的 html 页面添加 html 代码 例如 添加徽标 链接 css 文件等 rows db db member membership id request args 0 s
  • 使用 Google Static Maps API URL 渲染多边形

    我创建了一个脚本 通过将属性附加到静态地图 URL 来存储动态地图输入 以便我们可以在用户提交后引用它 由于我尚无法确定的原因 Polygon 根本不使用基本静态地图 URL 进行渲染 但它可以与第 3 方站点的静态地图功能配合使用 根据静
  • Google Sheets 查询删除标题不适用于偏移量

    无法弄清楚为什么其中一些查询有效而另一些则无效 只是想建立一个我自己的桌子 query TRANSPOSE ImportHtml C7 table 1 select limit 1 offset 1 query TRANSPOSE Impo
  • 使用逗号表示小数,使用句点表示千位 rdlc 报告

    我正在使用报告查看器控件 rdlc 来生成报告 我的其中一列表示来自 SQL 数据库的十进制值 例如 5199 9800 在此栏的末尾 对所有金额进行求和 因此 金额行的表示方式如下 Fields DEBIT Value 总行的表示方式如下
  • 在 Google 地图上显示 OpenStreetMap 边界(使用 v3 api)

    我想使用使用以下工具获得的 GeoJSON 数据在 Google 地图上显示城市边界 我访问 nominatim openstreetmap org 并搜索一个城市 例如丹佛 使用检索到的 OSM ID 在本例中为 253750 然后我使用
  • Angularjs - 如何对表单验证进行单元测试

    我在用着Jasmine http jasmine github io 对我的 Angular 应用程序进行单元测试 如何在我的控制器中测试表单验证 例如我有一个登录功能 scope login function if scope form
  • JavaFX 2.0 TabPane:选项卡位于左侧并保持选项卡标题水平

    我正在尝试为 Web 应用程序开发 GUI 并且想设置一个 TabPane 其中选项卡放置在左侧 保持选项卡标题水平 我已经找到了如何将选项卡放在左侧 但经过多次搜索后 我没有成功将标题设置为右对齐 它们仍然是垂直的并且难以阅读 我该如何解
  • Android Studio 项目视图中的重复文件

    我有一个奇怪的问题 项目特定的根级别文件 gitignore gradlew gradle properties 等 在 Android Studio 的项目视图中显示两次 有人知道如何解决这个问题吗 我尝试重新导入项目 删除 iml 和
  • 实体框架事务

    我有一个程序在两台服务器上重复运行 我需要在程序中选择和更新数据库记录 因此我需要来自EF的表锁或事务 否则程序的每个副本都可以选择和修改相同的记录 虽然第一个副本使数据库发生更改 但另一个副本不应运行相同的代码部分 我在 EF 中找到了
  • 有多少 Java 6 API 是由 Android 实现的?

    我想将一个小型开源AES加密类移植到Android上 如果Android的API尽可能接近Java 6 API 那么我的工作量会减少很多 实现了多少 或可参考 因为我尝试在谷歌上搜索这个内容 但我还没有想出任何有用的东西 恕我直言 一般来说
  • 代理下使用 HTTPClient 4.5 的 Resttemplate 连接超时

    如何设置超时时间 我已经设置了几乎所有的超时配置 通常没有代理就可以正常工作 当我使用代理连接详细信息进行连接时 会出现问题 日志显示正在连接 但未收到回复 2020 03 04 19 53 39 751 DEBUG main org sp