apache HttpClient API中的setConnectionTimeout,setSoTimeout和"http.connection-manager.timeout"之间有什么区别

Pra*_*eek 42 java httpconnection apache-httpclient-4.x

三者之间有什么区别(标记为评论):

MultiThreadedHttpConnectionManager connManag =  new MultiThreadedHttpConnectionManager();
HttpConnectionManagerParams managParams = connManag.getParams();

managParams.setConnectionTimeout(connectiontimeout); // 1
managParams.setSoTimeout(sotimeout); //2

HttpMethodBase baseMethod = null;

try {
  HttpClient client = new HttpClient(connManag);
  client.getParams().setParameter("http.connection-manager.timeout", poolTimeout); //3

  baseMethod = new GetMethod(…);
  int statusCode = client.executeMethod(…);

  …
}
catch (ConnectTimeoutException cte ){
  //Took too long to connect to remote host
}
catch (SocketTimeoutException ste){
  //Remote host didn’t respond in time
}
catch (Exception se){
  //Some other error occurred
}
finally {
  if (baseMethod != null)
    baseMethod.releaseConnection();
}
Run Code Online (Sandbox Code Playgroud)

1. setConnectionTimeout - 如果确定超时,则建立连接.

2. setSoTimeout - 如果确定两个连续数据包之间的不活动时间或时间差,

然后下面做了什么:

3. "http.connection-manager.timeout"

San*_*osh 65

在最低级别,HTTP是TCP套接字.因此,当您请求URL并获得响应时,在较低级别创建一个客户端Socket,它建立与远程服务器套接字的连接,发送一些数据并接收响应.

  • setConnectionTimeout:客户端尝试连接到服务器.这表示建立连接或服务器响应连接请求之前经过的时间.

  • setSoTimeout:建立连接后,客户端套接字在发送请求后等待响应.这是自客户端在服务器响应之前向服务器发送请求以来经过的时间.请注意,这HTTP Error 408与服务器发送给客户端的不同.换句话说,在建立连接之后到达客户端侧的两个连续数据分组之间的最大周期不活动.

  • http.connection-manager.timeout:MultiThreadedHttpConnectionManager使用HTTP连接池.它为每个主机设置了最大值和最小值.如果特定主机的所有连接都已达到最大值,则同一主机的新连接请求必须等到任何一个现有连接变为空闲.此参数表示发出连接请求和HttpConnectionManager返回连接之前经过的时间.


Mar*_*ari 24

此序列图可能会有所帮助.

apache http api

  • 优秀的图表;) (6认同)

Ani*_*kur 7

Apache HTTP客户端站点上的连接管理文档中提供了详细说明.

CoreConnectionPNames.SO_TIMEOUT ='http.socket.timeout': 定义套接字超时(SO_TIMEOUT),以毫秒为单位,即等待数据的超时,换句话说,两个连续数据包之间的最大周期不活动.超时值为零被解释为无限超时.此参数需要java.lang.Integer类型的值.如果未设置此参数,则读取操作不会超时(无限超时).

CoreConnectionPNames.CONNECTION_TIMEOUT ='http.connection.timeout': 确定建立连接之前的超时(以毫秒为单位).超时值为零被解释为无限超时.此参数需要java.lang.Integer类型的值.如果未设置此参数,则连接操作不会超时(无限超时).

连接管理器超时(http.connection-manager.timeout) - 等待连接管理器/池连接的时间

仅供记录

HttpParams httpParams = httpClient.getParams();
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000);
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);
Run Code Online (Sandbox Code Playgroud)

是另一种方式

HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000);
HttpConnectionParams.setSoTimeout(httpParams, timeout * 1000);
Run Code Online (Sandbox Code Playgroud)

  • 你如何设置http.connection-manager.timeout,我找不到正确的方法来做到这一点. (2认同)
  • 回答我自己的评论,您应该这样做。setConnectionRequestTimeout是一个:RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(connectTimeout).setConnectionRequestTimeout(connectionRequestTimeout).setSocketTimeout(socketTimeout).build(); (2认同)