2010-06-08 10 views
6

Ich habe einen Thread unter Tomcat, die eine HttpUrlConnection erstellt und liest es über BufferedInputStream.HttpURLConnection wird gesperrt

Nach dem Abrufen von Daten für einige URLs blockiert es. Ich habe den Jstack des Prozesses, der HttpUrlConnection gesperrt ist und BufferedInputStream auch gesperrt ist.

"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) 

Könnte jemand hier helfen. Danke

Antwort

6

Sie haben wahrscheinlich ein Problem am anderen Ende. read() auf einem InputStream ist ein Blocking-Vorgang - aus dem Javadoc (http://java.sun.com/javase/6/docs/api/): "Diese Methode blockiert, bis Eingabedaten verfügbar sind, das Ende des Streams erkannt wird oder eine Ausnahme ausgelöst wird."

Ist der Server am anderen Ende reagiert? Weißt du, ob es etwas gesendet hat?

edit: Um es klarer zu machen, ist der Thread im RUNNABLE-Zustand, so dass Sie nicht festgefahren sind - es klingt wie das, was Sie denken, dass es ist, aber hier gibt es keinen Beweis für einen Stillstand.

+0

Aus dem Protokoll scheint es, dass es von einigen xyz URL liest. Ich versuchte es mit wget und konnte schnell die Antwort bekommen. Ich bin mir nicht sicher, aus welchem ​​Grund das read() blockieren würde. Eine weitere Sache, ich importierte 'java.net.HttpURLConnection', aber die Stack-Trace zeigt ein anderes Paket. Irgendeine Ahnung? – Nayn

+0

Ich würde vorschlagen, Apache HTTP Client zu versuchen: http://hc.apache.org/httpclient-3.x/ anstelle von Sun's. Ich habe keine Erfahrung mit beiden, aber einige schnelle Suche deutet darauf hin, dass Apache viel besser ist. – nojo

+0

@Nayn: Das "andere Paket" im Stack-Trace ist die interne Implementierung von Sun. – talonx

Verwandte Themen