¿Cómo puedo establecer un tiempo de espera para un BufferedReader basado en una URLConnection en Java?

StackOverflow https://stackoverflow.com/questions/93357

  •  01-07-2019
  •  | 
  •  

Pregunta

Quiero leer el contenido de una URL pero no quiero "colgarme" si la URL no responde.Creé un BufferedReader usando la URL...

URL theURL = new URL(url);
URLConnection urlConn = theURL.openConnection();
urlConn.setDoOutput(true);
BufferedReader urlReader = new BufferedReader(newInputStreamReader(urlConn.getInputStream()));

...y luego comenzó el ciclo para leer el contenido...

do
    {
    buf = urlReader.readLine();
    if (buf != null)
        {
        resultBuffer.append(buf);
        resultBuffer.append("\n");
        }
    }
while (buf != null);

...pero si la lectura se bloquea, la aplicación se bloquea.

¿Hay alguna manera, sin procesar el código hasta el nivel del socket, de "esperar" la lectura si es necesario?

¿Fue útil?

Solución

Creo que URLConnection.setReadTimeout es lo que estás buscando.

Otros consejos

Si tienes java 1.4:

Supongo que el tiempo de espera de la conexión (URLConnection.setConnectTimeout(int timeout) ) no sirve de nada porque estás haciendo algún tipo de streaming.

---No mates el hilo--- Puede causar problemas desconocidos, descriptores abiertos, etc.

Genere un java.util.TimerTask donde comprobará si ha finalizado el proceso; de lo contrario, cierre el BufferedReader y el OutputStream de URLConnection.

Insertar una bandera booleana isFinished y configúrelo en verdadero al final de su ciclo y en falso antes del ciclo

TimerTask ft = new TimerTask(){
   public void run(){
     if (!isFinished){
       urlConn.getInputStream().close();
      urlConn.getOutputStream().close();
     }
   }
};

(new Timer()).schedule(ft, timeout);

Esto probablemente provocará una excepción io, por lo que deberá detectarla.La excepción no es mala en sí misma.Estoy omitiendo algunas declaraciones (es decir,finales) para que la clase anónima pueda acceder a sus variables.Si no es así, cree un POJO que mantenga una referencia y páselo a timertask.

Desde Java 1.5, es posible establecer el tiempo de espera de lectura en milisegundos en el socket subyacente mediante el método 'setReadTimeout(int timeout)' en la clase URLConnection.

Tenga en cuenta que también existe el 'setConnectTimeout(int timeout)' que hará lo mismo para la conexión inicial al servidor remoto, por lo que es importante configurarlo también.

He estado trabajando en este problema en un entorno JVM 1.4 recientemente.La respuesta estándar es utilizar las propiedades del sistema sun.net.client.defaultReadTimeout (tiempo de espera de lectura) y/o sun.net.client.defaultConnectTimeout.Estos están documentados en Propiedades de red y se puede configurar mediante el argumento -D en la línea de comando de Java o mediante una llamada al método System.setProperty.

Supuestamente, la implementación los almacena en caché, por lo que no puede cambiarlos de una cosa a otra, por lo que si se usan una vez, los valores se conservan.

Además, realmente no funcionan para conexiones SSL como HttpsURLConnection.Hay otras formas de solucionarlo utilizando un SSLSocketFactory personalizado.

Nuevamente, todo esto se aplica a JVM 1.4.x.En 1.5 y superiores, tiene más métodos disponibles en la API (como lo señalaron los otros respondedores anteriores).

Para Java 1.4, puede utilizar SimpleHttpConnectionManager.getConnectionWithTimeout(hostConf,CONNECTION_TIMEOUT) de Apache

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top