Подтвердить что ты не робот

В чем разница между setConnectionTimeout, setSoTimeout и "http.connection-manager.timeout" в 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"

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Эта диаграмма последовательности может помочь.

apache http api

Ответ 3

Подробное объяснение представлено в документации по управлению подключением на сайте клиента 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);

является альтернативным способом выполнения

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

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

Ответ 4

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

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