example - ¿Cómo puedo establecer un tiempo de espera contra un BufferedReader basado en un URLConnection en Java?
urlconnection java ejemplo (5)
Quiero leer el contenido de una URL pero no quiero "colgar" 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 los contenidos ...
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 afinar el código hasta el nivel del zócalo, de "agotar" la lectura si es necesario?
Creo que URLConnection.setReadTimeout es lo que estás buscando.
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 está el ''setConnectTimeout (int timeout)'' que hará lo mismo para la conexión inicial al servidor remoto, por lo que es importante configurarlo también.
Si tienes Java 1.4:
Supongo que el tiempo de espera de la conexión ( URLConnection.setConnectTimeout(int timeout)
) no sirve porque estás haciendo algún tipo de transmisión.
--- No matar el hilo --- Puede causar problemas desconocidos, descripciones abiertas, etc.
Genere un java.util.TimerTask donde comprobará si ha terminado el proceso, de lo contrario, cierre el BufferedReader y el OutputStream de URLConnection
Inserte un indicador booleano isFinished
y isFinished
en true 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 cause una excepción io, por lo que debe atraparlo. La excepción no es algo malo en sí mismo. Estoy omitiendo algunas declaraciones (es decir, finales) para que la clase anónima pueda acceder a tus variables. De lo contrario, cree un POJO que mantenga una referencia y páselo al horario de trabajo
He estado trabajando en este tema 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 pueden establecer mediante el argumento -D en la línea de comandos de Java o mediante una llamada al método System.setProperty.
Supuestamente, estos son almacenados en caché por la implementación, por lo que no puede cambiarlos de una cosa a otra para que se utilicen una vez, los valores se conservan.
Además, realmente no funcionan para las conexiones SSL ala HttpsURLConnection. Hay otras maneras de lidiar con eso usando una SSLSocketFactory personalizada.
De nuevo, todo esto se aplica a JVM 1.4.x. Con 1.5 y más, tiene más métodos disponibles en la API (como lo señalaron los demás encuestados más arriba).
Para Java 1.4, puede usar SimpleHttpConnectionManager.getConnectionWithTimeout (hostConf, CONNECTION_TIMEOUT) de Apache