【问题标题】:Connection and connection request timeout连接和连接请求超时
【发布时间】:2013-11-28 16:36:53
【问题描述】:

我正在使用 Http Apache 组件来执行 http 交互。我需要调整我的 http 客户端。为此,我有两个参数:连接超时和连接请求超时。在库文档和源代码中(没有找到 cmets)我没有找到这个术语的定义。我需要知道它们到底是什么意思。可能它们是在 HTTP 协议文档中定义的,但我找不到。所以,我的问题是这两个术语是什么意思以及它们之间的区别。

【问题讨论】:

标签: java http apache-httpclient-4.x apache-httpcomponents


【解决方案1】:

HttpClient 可以根据HttpClient javadocs 设置连接和套接字超时(setConnectionTimeout()setTimeout())。

Connection timeout 是与服务器建立连接之前的超时时间。

Socket timeout是接收数据的超时时间(socket timeout)。

例子:

假设您将浏览器指向一个网页。如果服务器在 X 秒内没有响应,则会发生连接超时。但是如果它建立了连接,那么服务器将开始为浏览器处理结果。如果 Y 秒内没有结束这个处理,就会发生套接字超时。

【讨论】:

  • 感谢您的回复,但还是有问题。这是请求配置生成器hc.apache.org/httpcomponents-client-4.3.x/httpclient/apidocs/…,它具有三个方法 setConnectionRequestTimeout、setConnectTimeout、setSocketTimeout(并且没有 cmets!)。所以我仍然不知道每种方法到底是做什么的,我应该使用什么方法。
  • 好吧,我终于发现 getConnectionRequestTimeout 返回 imeout 以毫秒为单位,在从连接管理器请求连接时使用。我猜那个连接管理器是 apache-httpcomponents 库类,所以我不会使用它。我将使用 setConnectionTimeout() 和 setTimeout()。
  • 这是评论比答案更有帮助的情况。
  • 答案并没有告诉我们连接请求超时是多少。必须检查 cmets。
【解决方案2】:

来自文档:

/**
 * Returns the timeout in milliseconds used when requesting a connection
 * from the connection manager. A timeout value of zero is interpreted
 * as an infinite timeout.
 * <p>
 * A timeout value of zero is interpreted as an infinite timeout.
 * A negative value is interpreted as undefined (system default).
 * </p>
 * <p>
 * Default: {@code -1}
 * </p>
 */
public int getConnectionRequestTimeout() {
    return connectionRequestTimeout;
}

/**
 * Determines the timeout in milliseconds until a connection is established.
 * A timeout value of zero is interpreted as an infinite timeout.
 * <p>
 * A timeout value of zero is interpreted as an infinite timeout.
 * A negative value is interpreted as undefined (system default).
 * </p>
 * <p>
 * Default: {@code -1}
 * </p>
 */
public int getConnectTimeout() {
    return connectTimeout;
}

这就是代码的样子:

HttpClientBuilder clientBuilder = HttpClientBuilder.create();
RequestConfig.Builder requestBuilder = RequestConfig.custom();
// Connection Timeout to establish a connection
requestBuilder = requestBuilder.setConnectTimeout(connectTimeoutMillis);
// Timeout to get a connection from the connection manager for the Http Client
requestBuilder = requestBuilder.setConnectionRequestTimeout(requestTimeoutMillis);
// Timeout between two data packets from the server
requestBuilder = requestBuilder.setSocketTimeout(requestTimeoutMillis);
clientBuilder.setDefaultRequestConfig(requestBuilder.build());
CloseableHttpClient httpClient = clientBuilder.build();

【讨论】:

  • 这个答案至少是在谈论被问到的问题,与接受的不同。但是,在哪种情况下从连接管理器请求连接会超时?设置它的含义是什么?你应该什么时候设置它?这真的很不清楚。
  • 连接管理器可以是像PoolingHttpClientConnectionManager这样的池。当池中的所有连接都被使用时,ConnectionRequestTimeout 指示您的代码应等待连接释放多长时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-14
  • 2013-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多