2010-06-08 18 views
6

Mam wątek uruchomiony pod tomcat, który tworzy HttpUrlConnection i odczytuje go przez BufferedInputStream.HttpURLConnection się blokuje

Po pobraniu danych dla niektórych adresów URL przestaje działać. Mam jstack procesu, który mówi, że HttpUrlConnection jest zablokowany i BufferedInputStream jest również zablokowany.

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

Czy ktoś może pomóc tutaj. Dzięki

Odpowiedz

6

Prawdopodobnie masz problem na drugim końcu. read() na InputStream jest operacją blokującą - z javadoc (http://java.sun.com/javase/6/docs/api/): "Ta metoda blokuje dostęp do danych wejściowych, wykrywa koniec strumienia lub zostaje zgłoszony wyjątek."

Czy serwer po drugiej stronie odpowiada? Czy wiesz, czy coś jest wysłane?

edytuj: Aby było bardziej zrozumiałe, wątek jest w stanie RUNNABLE, więc nie jesteś zablokowany - wydaje się, że tak właśnie myślisz, ale nie ma tu żadnych dowodów na istnienie impasu.

+0

Z logu wynika, że ​​czyta z jakiegoś adresu URL Xyz. Próbowałem z wget i mogłem szybko uzyskać odpowiedź. Nie jestem pewien, z jakiego powodu byłby bloku read(). Jeszcze jedno, zaimportowałem 'java.net.HttpURLConnection', ale ślad stosu pokazuje inny pakiet. Jakaś wskazówka? – Nayn

+0

Proponuję wypróbowanie klienta HTTP Apache'a: http://hc.apache.org/httpclient-3.x/ zamiast Sun's. Nie mam doświadczenia z żadną z nich, ale niektóre szybkie poszukiwania sugerują, że Apache jest znacznie lepszy. – nojo

+0

@Nayn: "Innym pakietem" w stosie śledzenia jest wewnętrzna implementacja Sun. – talonx

Powiązane problemy