2010-06-08 30 views
6

Tôi có một chuỗi chạy dưới tomcat tạo HttpUrlConnection và đọc nó thông qua BufferedInputStream.HttpURLKết nối bị khóa

Sau khi tìm nạp dữ liệu cho một số url, nó sẽ ngăn chặn. Tôi đã nhận được jstack của quá trình mà nói HttpUrlConnection bị khóa và BufferedInputStream cũng bị khóa.

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

Ai đó có thể trợ giúp ở đây. Cảm ơn

Trả lời

6

Có thể bạn đang gặp sự cố ở đầu bên kia. read() trên InputStream là một hoạt động chặn - từ javadoc (http://java.sun.com/javase/6/docs/api/): "Phương thức này chặn cho đến khi dữ liệu đầu vào khả dụng, cuối luồng được phát hiện hoặc ngoại lệ được ném".

Máy chủ ở đầu kia có phản hồi không? Bạn có biết nếu nó được gửi đi không?

chỉnh sửa: Để làm cho nó rõ ràng hơn, chủ đề ở trạng thái RUNNABLE, do đó bạn không bị bế tắc - có vẻ như đó là những gì bạn đang nghĩ, nhưng không có bằng chứng ở đây về bất kỳ bế tắc nào.

+0

Từ nhật ký, có vẻ như nó đang đọc từ một số url xyz. Tôi đã thử với wget và có thể nhanh chóng nhận được phản hồi. Tôi không chắc chắn cho những gì lý do sẽ đọc() khối. Một điều nữa, tôi đã nhập 'java.net.HttpURLConnection' nhưng theo dõi ngăn xếp hiển thị một số gói khác. Bất kỳ đầu mối? – Nayn

+0

Tôi sẽ đề nghị dùng thử HTTP Client của Apache: http://hc.apache.org/httpclient-3.x/ thay vì Sun's. Tôi không có kinh nghiệm với một trong hai, nhưng một số tìm kiếm nhanh chóng cho thấy rằng Apache là tốt hơn nhiều. – nojo

+0

@Nayn: "gói khác" trong dấu vết ngăn xếp là triển khai nội bộ của Sun. – talonx

Các vấn đề liên quan