【问题标题】:why `setConnectionRequestTimeout` doesn't stop my 1 min get request?为什么 `setConnectionRequestTimeout` 不会停止我的 1 分钟获取请求?
【发布时间】:2015-07-24 13:30:41
【问题描述】:

我有这个代码:

    RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(40 * 1000)
            .setConnectionRequestTimeout(40 * 1000)
            .setSocketTimeout(40 * 1000)
            .build();
    client = HttpClientBuilder
            .create()
            .setDefaultRequestConfig(requestConfig)
            .build();
}

    try {

        Stopwatch stopWatch = Stopwatch.createStarted();
        response = client.execute(new HttpGet(routingRequestUrl));
        stopWatch.stop();

    } catch (Exception e) {
        answer.errorMsg = e.getMessage();
        answer.latency =  null;
    }

当我的客户端配置不包含 .setSocketTimeout(40 * 1000) - 秒表显示请求可能需要超过 1 分钟。

当我单独或一起尝试 setConnectTimeoutsetConnectionRequestTimeout 时会发生这种情况。

为什么只有.setSocketTimeout(40 * 1000) 有效检查超时 40 秒?而另一个不是?

这些是印刷品:

Read timed out

Timeout waiting for connection from pool

第一个是由setConnectionRequestTimeout 触发的,第二个是由setSocketTimeout 触发的吗?

【问题讨论】:

标签: java http request timeout client


【解决方案1】:

https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/client/config/RequestConfig.html

getConnectionRequestTimeout()

返回从连接管理器请求连接时使用的超时时间(毫秒)。

getConnectTimeout()

确定建立连接前的超时时间(以毫秒为单位)。

getSocketTimeout()

以毫秒为单位定义套接字超时 (SO_TIMEOUT),这是等待数据的超时时间,或者换句话说,是两个连续数据包之间的最大不活动时间。

__

所以,第一个 connectionRequestTimeout 发生在您有一个连接池并且它们都忙时,不允许连接管理器给您一个连接来发出请求。

connectTimeout 在建立连接时发生。例如在进行 tcp 握手时。

socketTimeout 如描述所说,是等待数据时的超时。通常发生在您的服务器速度较慢时。

【讨论】:

  • 所以如果我想终止 40 秒后没有返回的请求,我应该只使用 socketTimeout 吗?
  • @EladBenda2 不幸的是,您需要创建自己的包装器,它可以包含connectionRequestTimeoutconnectTimeoutsocketTimeoutsocketTimeout 是接收数据字节之间的时间(以秒为单位),因此只要您正在接收数据,它就不会超时。
猜你喜欢
  • 1970-01-01
  • 2012-08-01
  • 2018-10-03
  • 2021-03-21
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多