В чем разница между setConnectionTimeout, setSoTimeout и "http.диспетчер соединений.тайм-аут " в API Apache HttpClient

в чем разница между тремя(помечены как комментарии) :

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();
}

1. setConnectionTimeout - если он определяет время ожидания до установления соединения.

2. setSoTimeout - если он определяет период бездействия или разницу во времени между двумя последовательными пакетами,

тогда что делает нижеприведенный:

3. "http.connection-manager.timeout"

4 ответов


на самом низком уровне HTTP-TCP-сокет. Поэтому, когда вы запрашиваете URL и получаете ответ, на более низком уровне создается клиентский сокет, который устанавливает соединение с удаленным сокетом сервера, отправляет некоторые данные и получает ответ.

  • setConnectionTimeout : клиент пытается подключиться к серверу. Это означает время, прошедшее до установления соединения или ответа сервера на соединение запрос.

  • setSoTimeout : после установления соединения клиентский сокет ожидает ответа после отправки запроса. Это время, прошедшее с момента отправки клиентом запроса на сервер до ответа сервера. Обратите внимание, что это не то же самое как HTTP Error 408 который сервер отправляет клиенту. Другими словами его максимальный период бездействия между двумя последовательными пакетами данных, поступающими на сторону клиента после подключения установленный.

  • протоколу HTTP.диспетчер соединений.ожидания : MultiThreadedHttpConnectionManager использует пул HTTP-соединений. Он имеет максимальные и минимальные значения на хост, установленные для него. Если все соединения для конкретного хоста достигли максимального значения, запрос на новое соединение для того же хоста должен будет подождать, пока любое из существующих соединений не станет свободным. Этот параметр обозначает время, прошедшее после выполнения запроса на подключение и до HttpConnectionManager вернулся соединения.


эта схема последовательности может помочь.

sequence diagram for timeouts


подробное объяснение приводится в документация по управлению соединениями на сайте HTTP-клиента Apache.

CoreConnectionPNames.SO_TIMEOUT= ' http.розетка.timeout': определяет таймаут сокета (SO_TIMEOUT) в миллисекундах, который является таймаутом ожидания данных или, иначе говоря, максимальным периодом бездействия между двумя последовательными пакетами данных). Значение тайм-аута, равное нулю, интерпретируется как бесконечный тайм-аут. Этот параметр ожидает значение типа java.ленг.Целое число. Если этот параметр не задан, время ожидания операций чтения не истекает (бесконечное время ожидания).

CoreConnectionPNames.CONNECTION_TIMEOUT= ' http.соединение.тайм-аут': определяет время ожидания в миллисекундах до установления соединения. Значение тайм-аута, равное нулю, интерпретируется как бесконечный тайм-аут. Этот параметр ожидает значение типа java.ленг.Целое число. Если этот параметр не задан, время ожидания операций подключения не истекает (бесконечно таймаут.)

тайм-аут диспетчера соединений (http.диспетчер соединений.тайм-аут) - время ожидания соединения от диспетчера соединений / пула

просто для протокола

HttpParams httpParams = httpClient.getParams();
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000);
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000);

- это альтернативный способ сделать

HttpParams httpParams = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000);
HttpConnectionParams.setSoTimeout(httpParams, timeout * 1000);

(подробнее здесь)


простыми словами:

  • время ожидания соединения: ограничение времени, которое ваше приложение ожидает при попытке установить соединение с сервером и не может (адрес неправильный, или сервер не работает и т. д...)
  • время ожидания сокета: ограничение времени ожидания вашего приложения после подключения к серверу, но все еще ждет ответа (задержка может быть вызвана зависанием сервера, например)
  • время ожидания диспетчера соединений: ограничение время ожидания запроса, когда находится в очереди, ожидая освобождения одного из запросов в пуле. Другими словами, в HTTP у нас есть пул соединений с максимальным размером. При загрузке приложения пул может быть заполнен, и любой новый запрос должен ждать другого запроса из пула для завершения.