2010-06-08 15 views
6

Tengo un subproceso ejecutándose bajo tomcat que crea un HttpUrlConnection y lo lee a través de BufferedInputStream.HttpURLConnection bloqueado

Después de obtener datos para algunas direcciones URL, se detiene. Obtuve el jstack del proceso que dice que HttpUrlConnection está bloqueado y BufferedInputStream también está bloqueado.

"http-8080-1" daemon prio=10 tid=0x08683400 nid=0x79c9 runnable [0x8f618000] 
    java.lang.Thread.State: RUNNABLE 
     at java.net.SocketInputStream.socketRead0(Native Method) 
     at java.net.SocketInputStream.read(SocketInputStream.java:129) 
     at java.io.BufferedInputStream.fill(BufferedInputStream.java:218) 
     at java.io.BufferedInputStream.read1(BufferedInputStream.java:258) 
     at java.io.BufferedInputStream.read(BufferedInputStream.java:317) 
     - locked <0x956ef8c0> (a java.io.BufferedInputStream) 
     at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:687) 
     at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:632) 
     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1072) 
     - locked <0x956ef910> (a sun.net.www.protocol.http.HttpURLConnection) 

Podría alguien ayudar aquí. Gracias

Respuesta

6

Probablemente tenga un problema en el otro extremo. read() en un InputStream es una operación de bloqueo, desde el javadoc (http://java.sun.com/javase/6/docs/api/): "Este método bloquea hasta que los datos de entrada estén disponibles, se detecte el final de la secuencia o se genere una excepción".

¿Está respondiendo el servidor del otro lado? ¿Sabes si se envió algo?

editar: Para hacerlo más claro, el hilo está en estado RUNNABLE, por lo que no está estancado: parece que eso es lo que estás pensando que es, pero aquí no hay evidencia de un punto muerto.

+0

Desde el registro parece que está leyendo desde alguna url xyz. Intenté con wget y pude obtener la respuesta rápidamente. No estoy seguro de la razón por la cual el bloque de lectura(). Una cosa más, importé 'java.net.HttpURLConnection' pero el seguimiento de pila muestra algún otro paquete. ¿Cualquier pista? – Nayn

+0

Sugiero probar el cliente HTTP de Apache: http://hc.apache.org/httpclient-3.x/ en lugar de Sun. No tengo experiencia con ninguno de ellos, pero una búsqueda rápida sugiere que Apache es mucho mejor. – nojo

+0

@Nayn: El "otro paquete" en el seguimiento de la pila es la implementación interna de Sun. – talonx

Cuestiones relacionadas