2017-05-30 43 views
8

Tôi đang thử nghiệm với HTTP/2 ứng dụng khách từ jdk 9-ea+171. Mã được lấy từ this example:Java 9 HttpClient treo

HttpClient client = HttpClient.newHttpClient(); 

HttpRequest request = HttpRequest.newBuilder() 
    .uri(new URI("https://www.google.com/")) 
    .build(); 

HttpResponse<String> response 
     = client.send(request, HttpResponse.BodyHandler.asString()); 

Tuy nhiên, khách hàng sẽ treo trên dòng cuối cùng mãi mãi. Xin lời khuyên làm thế nào để sửa chữa nó?

Gỡ lỗi hiển thị nó vô hạn chờ trong phương thức waitUntilPrefaceSent().

+0

tôi có thể lấy nó để làm việc nếu tôi sử dụng quá tải khác của 'newBuilder' mà phải mất một 'URI' trực tiếp, và tôi sử dụng' http' thay vì 'https'. Tôi nhận được NPE với 'https'. –

+0

Nó hoạt động với 'http' vì máy khách sử dụng' HTTP/1.1' như chúng ta có thể thấy từ 'response.version()'. Tôi cần chính xác 'https' và lợi thế của giao thức' HTTP/2'. – awfun

+0

Tôi đã gặp phải NPE khi phương thức yêu cầu (ví dụ: GET) không được chỉ định. – awfun

Trả lời

4

Đây là lỗi trong quá trình triển khai kết nối HTTP2 mới nhất của bản dựng. Nó không xảy ra với các bản dựng trước đó.

Trước hết, bạn cần chỉ định phương thức GET để tránh nhận ngoại lệ con trỏ null.

Điều gì xảy ra là chuỗi chính đang chờ kết nối đầu tiên được gửi. Nó khóa một chốt đếm xuống để chờ đợi sự tiếp nhận của lời nói đầu này. Để đánh thức chính nó, bất kỳ HttpClient nào cũng tạo một chuỗi trợ giúp đọc lưu lượng truy cập đến. Chủ đề này được cho là để đánh thức các chủ đề chính nhưng đôi khi, điều này không bao giờ xảy ra. Nếu bạn chạy ví dụ của bạn, thường xuyên đủ, bạn sẽ thấy rằng điều này đôi khi làm việc. Tôi đoán có một cuộc đua để đọc lời nói đầu.

Thật không may, việc đọc lời nói đầu không tôn trọng bất kỳ thời gian chờ nào, vì vậy không có cách thức thức dậy chủ đề chính, trừ việc làm gián đoạn sợi chính.

Dưới đây là một vé chính thức: https://bugs.openjdk.java.net/browse/JDK-8181430

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