HttpClient atrapados sin excepción alguna

Estoy desarrollando un tiempo de ejecución de la aplicación que en gran medida se utiliza el HttpClient de apache.

En mi primera prueba, la aplicación funcionó a la perfección hasta que sólo quedó atascado. No fue detenido, no lanzar ninguna excepción, solo se queda ahí sin hacer nada.

Hice un segundo, justo ahora y se detuvo el tiempo y se detuvo después de aprox. 24 horas de constante funcionamiento. Además me di cuenta de que la conexión a internet de mi computadora portátil en el que tuve que correr era terminar en el exacto momento en que la solicitud se quedó atascado. Tuve que reiniciar el adaptador WLAN para la red en funcionamiento de nuevo.

La aplicación, aunque, no volver a trabajar después de la conexión de nuevo. Y ahora, es atrapado de nuevo.

Hay ningún tiempo de espera de la controladora yo no soy consciente de que en el HttpClient? Por qué no mi aplicación lanzar una excepción cuando la conexión está abajo?

La parte que utiliza el cliente ve de la siguiente manera;

public HttpUtil(ConfigUtil config) {
    this.config = config;

    client = new DefaultHttpClient();
    client.getParams().setParameter(HttpProtocolParams.USER_AGENT, this.config.getProperty("httputil.userAgent"));
}

public String getContentAsString(String url) throws ParseException, ClientProtocolException, IOException {
    return EntityUtils.toString(
            client.execute(
                    new HttpGet(url)).getEntity());
}

La aplicación llama repetidamente a httputil.getContentAsString() en la Url que necesita.

  • Tal vez su entidad es una cadena vacía.
  • Entonces mi método aún retorno que la cadena vacía, ¿no? O lanzar una excepción, al menos?
  • Tengo el mismo problema. httpEntity.consumeContent() save me. stackoverflow.com/questions/9505358/…
  • ¿alguna vez resolver este problema?
  • Era un problema de tiempo de espera. Cuando he añadido un tiempo de espera para la conexión fue resuelto IIRC (fue hace mucho tiempo…). Cuál es el problema subyacente de la conexión era, no recuerdo.

7 Kommentare

  1. 12

    Este código está ahora en desuso (get HttpParams, etc). La mejor manera es:

    RequestConfig defaultRequestConfig = RequestConfig.custom()
        .setCookieSpec(CookieSpecs.BEST_MATCH)
        .setExpectContinueEnabled(true)
        .setStaleConnectionCheckEnabled(true)
        .setTargetPreferredAuthSchemes(Arrays.asList(AuthSchemes.NTLM, AuthSchemes.DIGEST))
        .setProxyPreferredAuthSchemes(Arrays.asList(AuthSchemes.BASIC))
        .build();
    
    HttpGet httpGet = new HttpGet(url);    
    RequestConfig requestConfig = RequestConfig.copy(defaultRequestConfig)
        .setSocketTimeout(5000)
        .setConnectTimeout(5000)
        .setConnectionRequestTimeout(5000)
        .build();
    httpGet.setConfig(requestConfig);
  2. 7

    A partir de la versión 4.4, ambas respuestas por parte de los usuarios user2393012 y Stephen C han quedado obsoletos. No estoy seguro de si hay otra forma de hacerlo, pero mi forma de hacerlo es mediante el uso de un generador de paradigma, HTTPClientBuilder.

    Ex.

    HttpClients.custom().setConnectionTimeToLive(1, TimeUnit.MINUTES).build()

    Una muy similares (que en realidad podría haber sido OP problema) problema a lo OP menciona también sucede, pero es debido a Apache configuración predeterminada conexiones simultáneas a sólo dos conexiones por cliente. La solución a esto sería aumentar el máximo de conexiones o cerca de ellos si puedes.

    Para aumentar el máximo de conexiones:

    HttpClients.custom().setMaxConnPerRoute(100000).build()

    Para cerrar conexiones, puede utilizar una BasicHttpClientConnectionManager y llamar al método close para

  3. 6

    Usted no ha dicho que la versión de HttpClient está utilizando, pero suponiendo que se trata de la versión 4, este artículo de blog explica qué hacer.

    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpParams params = httpClient.getParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, connectionTimeoutMillis);
    HttpConnectionParams.setSoTimeout(httpParams, socketTimeoutMillis);
    • Creo que esto está ahora en desuso
  4. 5

    Me dio una respuesta similar en otro hilo (HttpClient se cuelga en socketRead0 con el éxito de su método execute)

    Que en mi caso, fue la creación de la connectionTimeout y socketTimeout en la solicitud, pero no en la conexión de socket utilizado durante el establecimiento de la conexión SSL. Como resultado, me gustaría que en algún momento se bloquea durante el protocolo de enlace SSL. Por debajo de un cierto código que establece que todos los 3 tiempos de espera con la v4.4 (también probado en v4.5)

    //Configure the socket timeout for the connection, incl. ssl tunneling
    connManager = new PoolingHttpClientConnectionManager();
    connManager.setMaxTotal(200);
    connManager.setDefaultMaxPerRoute(100);
    
    SocketConfig sc = SocketConfig.custom()
        .setSoTimeout(soTimeoutMs)
        .build();
    
    connManager.setDefaultSocketConfig(sc);
    
    HttpClient client = HttpClients.custom()
                .setConnectionManager(connManager)
                .setConnectionManagerShared(true)
                .build();
    
    //configure the timeouts (socket and connection) for the request
    RequestConfig.Builder config = = RequestConfig.copy(RequestConfig.DEFAULT);
    config.setConnectionRequestTimeout(connectionTimeoutMs);
    config.setSocketTimeout(socketTimeoutMs);
    
    HttpRequestBase req = new HttpGet(uri);
    req.setConfig(config.build());
    
    client.execute(req);
  5. 4

    Tengo todos los tiempos de instalación muy bien pero me enteré de que tenemos en la url que hace los bloques http, pero no envía los resultados(funciona bien en chrome, pero en cliente http que se cuelga para siempre, incluso con el tiempo de espera de conjunto). Por suerte tengo el servidor y acabo de volver de un poco de basura y ya no se cuelga. Esto que parece un único error en el cliente http no manejar algún tipo de vacío chunking caso bien(aunque yo podría estar de camino)….Yo sólo sé que se cuelga cada vez que en la misma url con datos vacíos y que la dirección url es http chunking csv descargar de vuelta a nuestro cliente http.

    • Me enfrento a este problema para este día. Creo que mi informe de error fue cerrado porque yo era incapaz de explicar las cosas de la propiedad y para su reproducción. Pero creo que la mejor manera de reproducir este error es desconectar la conexión en medio de una solicitud post. Yo creo que va a hacer quedar atascado incluso con el tiempo de espera establecido
  6. 3

    Por defecto, HttpClient no tiempo de espera (que causa más problemas que ayuda). Lo que describes podría ser un problema de hardware, si su adaptador de red murió, el HttpClient va a colgar.

    Aquí están las parámetros conjunto para HttpParams como parte del constructor para DefaultHttpClient incluyendo

    http.zócalo.tiempo de espera de: define el tiempo de espera del socket (SO_TIMEOUT) en
    milisegundos, que es el tiempo de espera para la espera de los datos o, en
    de manera diferente, en un periodo máximo de inactividad entre dos datos consecutivos
    los paquetes). Un valor de tiempo de espera de cero se interpreta como un infinito
    tiempo de espera. Este parámetro se espera un valor de tipo java.lang.Entero. Si
    este parámetro no está definido, las operaciones de lectura no el tiempo de espera infinito
    tiempo de espera).

    La que se establece un tiempo de espera en la conexión, por lo que después de la serie de tiempo de espera se producirá una excepción.

  7. 3

    Tuve el mismo problema, se pegó porque yo no cerrar DefaultHttpClient.

    Así que esto es incorrecto:

    try{
        DefaultHttpClient httpclient = new DefaultHttpClient();
        ...
    } catch (Exception e){
        e.PrintStackTrace();
    }

    Y este es el correcto:

    try (DefaultHttpClient httpclient = new DefaultHttpClient()){
        ...
    } catch (Exception e){
        e.PrintStackTrace();
    }

    Espero que ayude a alguien.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea