В чем разница между 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"
Ответы
Ответ 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 у нас есть пул соединений с максимальным размером. При наличии нагрузки на приложение пул может быть заполнен, и любой новый запрос должен ждать завершения другого запроса из пула.