2014-02-05 2 views
14

Я использую Apache http client 4.3.2 для отправки запросов на получение. То, что я сделал это:Установка времени ожидания в apache http-клиенте

private final RequestConfig requestConfig = RequestConfig.custom() 
     .setConnectTimeout(1000) 
     .setConnectionRequestTimeout(1000) 
     .setSocketTimeout(1000) 
     .build(); 
private final HttpClient client = HttpClientBuilder.create() 
     .disableAuthCaching() 
     .disableAutomaticRetries() 
     .disableConnectionState() 
     .disableContentCompression() 
     .disableCookieManagement() 
     .disableRedirectHandling() 
     .setDefaultRequestConfig(requestConfig) 
     .build(); 

И при отправке запроса:

HttpGet request = null; 

try { 
    request = new HttpGet(url); 
    if (client.execute(request).getStatusLine().getStatusCode() == 200) { 
     /* do some work here */ 
    } 
} catch (Exception e) { 
    Logger.error(e); 
} finally { 
    if (request != null) { 
     request.releaseConnection(); 
    } 
} 

Но некоторые из моих запросов все еще занимает много времени тайм-аута. Это исключение из стека:

java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(SocketInputStream.java:152) 
    at java.net.SocketInputStream.read(SocketInputStream.java:122) 
    at org.apache.http.impl.io.SessionInputBufferImpl.streamRead(SessionInputBufferImpl.java:136) 
    at org.apache.http.impl.io.SessionInputBufferImpl.fillBuffer(SessionInputBufferImpl.java:152) 
    at org.apache.http.impl.io.SessionInputBufferImpl.readLine(SessionInputBufferImpl.java:270) 
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:140) 
    at org.apache.http.impl.conn.DefaultHttpResponseParser.parseHead(DefaultHttpResponseParser.java:57) 
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:260) 
    at org.apache.http.impl.DefaultBHttpClientConnection.receiveResponseHeader(DefaultBHttpClientConnection.java:161) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.http.impl.conn.CPoolProxy.invoke(CPoolProxy.java:138) 
    at com.sun.proxy.$Proxy0.receiveResponseHeader(Unknown Source) 
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:271) 
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:123) 
    at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:254) 
    at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:195) 
    at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:186) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:82) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:106) 
    at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:57) 

Есть ли другое значение времени, которое я должен установить? Что я делаю не так?

+4

Upvote, у меня есть тот же самый пробок (с использованием 4.3.2), но воспроизведение сложно. В моем случае не происходит тайм-аута, и потоки работают в течение нескольких дней. –

+0

У меня такая же проблема: 'request.viaProxy (proxy) .connectTimeout (1000) .socketTimeout (1000) .execute() .returnContent(). AsString (StandardCharsets.UTF_8);' возьмет даже 1 мунит! – soulmachine

ответ

-1

.setSocketTimeout(1000) обозначает 1 секунду бездействия в приложении при чтении пакетов данных, вызывает это исключение.

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

Проверьте, что максимально возможное ограничение по времени можно было бы ожидать, чтобы приложение взять для операции считывания данных, например, 50 секунд (крайний случай для массовых данных) -> затем обновить .setSocketTimeout(50000)

-1

Вот фрагмент кода пример для достижения цели:

int timeout = 5; 
RequestConfig config = RequestConfig.custom() 
    .setConnectTimeout(timeout * 1000) 
    .setConnectionRequestTimeout(timeout * 1000) 
    .setSocketTimeout(timeout * 1000).build(); 
CloseableHttpClient client = HttpClientBuilder.create().setDefaultRequestConfig(config).build(); 

Это является рекомендуемым способом настройки всех трех тайм-аута в Типобезопасный и читаемым образом.

Here is the full detail

2

Когда я имел эту проблему я изменил мою просьбу, чтобы настроить время ожидания на каждом запросе.

//... 
HttpRequestBase request = new HttpGet(url); //or HttpPost 

RequestConfig.Builder requestConfig = RequestConfig.custom(); 
requestConfig.setConnectTimeout(30 * 1000); 
requestConfig.setConnectionRequestTimeout(30 * 1000); 
requestConfig.setSocketTimeout(30 * 1000); 

request.setConfig(requestConfig.build()); 

CloseableHttpResponse response = client.execute(request); 
//... 

Он работал нормально.

Смежные вопросы