Почему HttpClient генерирует исключение SocketTimeOutException при выполнении POST - PullRequest
3 голосов
/ 02 июля 2010

У меня есть код, подобный следующему:

try {
    HttpPost post = new HttpPost(httpsUrl);
    setHeaders(post);

    HttpEntity entity = new StringEntity(request, "UTF-8");

    post.setEntity(entity);

    HttpResponse response = httpclient.execute(post);
    String result = EntityReader.readContent(response.getEntity());
    checkAnswer(result);
    return result;

} catch (Exception e) {
    throw new ZapException("Error executing the http post request: "+e.getMessage(), e);
}

Он отправляет содержимое request на сервер через POST, используя экземпляр httpclient, который, возможно, уже использовался ранее (у него включены постоянные соединения, поскольку мы отправляем довольно много запросов на тот же сервер ... ).

Это иногда завершается с ошибкой SocketTimeoutException с "Read timed out" в качестве сообщения. Нам непонятно, почему он терпит неудачу только в некоторых случаях, а в большинстве случаев - нет. Что дает?

1 Ответ

1 голос
/ 25 ноября 2012

В дальнейшем я предполагаю, что вы используете Apache Commons HttpClient (org.apache.commons.httpclient.HttpClient).

Возможно, вы получите SocketTimeoutException просто потому, что иногда хост, с которым взаимодействует ваш экземпляр HttpClient, слишком долго реагирует, вызывая процедуру отмены HttpClient. Вы можете увеличить время ожидания соединения и сокета с помощью следующего

HttpConnectionParams params = httpclient.getHttpConnectionManager().getParams();
params.setConnectionTimeout(20000);
params.setSoTimeout(15000);

Кроме того, если вы все еще сталкиваетесь с таймаутами, несмотря на увеличение лимитов тайм-аута, хорошей практикой является корректная обработка SocketTimeoutException - например, повторной попыткой соединения второй и третий раз.

...