В чем разница между 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"
4 ответа
На самом низком уровне HTTP - сокет TCP. Поэтому, когда вы запрашиваете URL и получаете ответ, на более низком уровне создается клиентское гнездо, которое устанавливает соединение с удаленным сокетом сервера, отправляет некоторые данные и получает ответ.
setConnectionTimeout: клиент пытается подключиться к серверу. Это обозначает время, прошедшее до того, как было установлено соединение или сервер ответил на запрос соединения.
setSoTimeout: после установления соединения клиентский сокет ожидает ответа после отправки запроса. Это время, прошедшее с того момента, как клиент отправил запрос на сервер, прежде чем сервер ответит. Обратите внимание, что это не то же самое, что
HTTP Error 408
который сервер отправляет клиенту. Другими словами, его максимальный период бездействия между двумя последовательными пакетами данных, поступающими на сторону клиента после установления соединения.http.connection-manager.timeout:
MultiThreadedHttpConnectionManager
использует пул HTTP-соединений. Для него установлены максимальные и минимальные значения для каждого хоста. Если все соединения для определенного хоста достигли максимального значения, запрос на новое соединение для того же хоста должен будет ждать, пока любое из существующих соединений не станет свободным. Этот параметр обозначает время, прошедшее с момента запроса на подключение и доHttpConnectionManager
вернул соединение.
Подробное объяснение приведено в документации по управлению подключениями на сайте HTTP-клиента Apache.
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);
Простыми словами:
- тайм-аут соединения: лимит времени, в течение которого ваше приложение ожидает, когда пытается установить соединение с сервером, и не может этого сделать (неправильный адрес или сервер не работает и т. д.)
- Время ожидания сокета: ограничение времени, в течение которого ваше приложение ожидает подключения к серверу, но все еще ожидает ответа (например, задержка может быть вызвана зависанием сервера)
- Тайм-аут диспетчера подключений: ограничение времени ожидания запроса, когда он находится в очереди, ожидая освобождения одного из запросов в пуле. Другими словами, в HTTP у нас есть пул соединений с максимальным размером. При наличии нагрузки на приложение пул может быть заполнен, и любой новый запрос должен ждать завершения другого запроса из пула.