2015-06-17 19 views
8
CloseableHttpResponse response = null; 
try { 
    // do some thing .... 
    HttpPost request = new HttpPost("some url"); 
    response = getHttpClient().execute(request); 
    // do some other thing .... 
} catch(Exception e) { 
    // deal with exception 
} finally { 
    if(response != null) { 
     try { 
      response.close(); // (1) 
     } catch(Exception e) {} 
     request.releaseConnection(); // (2) 
    } 
} 

Tôi đã thực hiện yêu cầu thực hiện http như trên.sự khác nhau giữa CloseableHttpResponse.close() và httpPost.releaseConnection() là gì?

Để phát hành kết nối cơ bản, điều này có đúng để gọi (1) và (2) không? và sự khác biệt giữa hai lời kêu gọi là gì?

Rất cám ơn!

Trả lời

11

Câu trả lời ngắn:

request.releaseConnection() được giải phóng các kết nối HTTP cơ bản để cho phép nó được tái sử dụng. response.close() đang đóng luồng (không phải kết nối), luồng này là nội dung phản hồi mà chúng tôi đang truyền trực tuyến từ ổ cắm mạng.

dài trả lời:

Các mô hình đúng theo trong bất kỳ phiên bản mới> 4.2 và có lẽ thậm chí trước đó, không phải là để sử dụng releaseConnection.

request.releaseConnection() nhả tiềm ẩn HttpConnection nên yêu cầu có thể được tái sử dụng, tuy nhiên doc Java nói:

Một phương pháp thuận tiện để đơn giản hóa di cư từ HttpClient 3.1 API ...

Thay vì phát hành kết nối, chúng tôi đảm bảo nội dung phản hồi được tiêu thụ hoàn toàn, do đó đảm bảo kết nối được phát hành và sẵn sàng để tái sử dụng. Một ví dụ ngắn được hiển thị bên dưới:

CloseableHttpClient httpclient = HttpClients.createDefault(); 
HttpGet httpGet = new HttpGet("http://targethost/homepage"); 
CloseableHttpResponse response1 = httpclient.execute(httpGet); 
try { 
    System.out.println(response1.getStatusLine()); 
    HttpEntity entity1 = response1.getEntity(); 
    // do something useful with the response body 
    String bodyAsString = EntityUtils.toString(exportResponse.getEntity()); 
    System.out.println(bodyAsString); 
    // and ensure it is fully consumed (this is how stream is released. 
    EntityUtils.consume(entity1); 
} finally { 
    response1.close(); 
} 
+3

Xin chào Matt, có bất kỳ tham chiếu nào về điều này không? Tài liệu không rõ ràng về cách kết nối có thể được phát hành, ví dụ nếu thông qua response.close hoặc httpclient.close. Tất cả các ví dụ đều chỉ chứa các ví dụ trước, do đó, nó xuất hiện này là đủ, nhưng chỉ để chắc chắn. Ngoài ra, bạn có thể giải thích tại sao EntityUtils.consume là cần thiết ngay cả sau khi EntityUtils.toString mà nên xả đầu vào hoàn chỉnh? –

+0

Tại sao EntityUtils.consume? Câu trả lời này giải quyết câu hỏi của bạn: "Nó thực sự thích hợp để trở thành một" công dân tốt "(và thực sự biết các hợp đồng của các giao diện HTTPClient) Những gì EntityUtils.consume sẽ làm là giải phóng tất cả các tài nguyên do httpEntity nắm giữ, về cơ bản có nghĩa là phát hành bất kỳ Luồng và đưa đối tượng Connection trở lại hồ bơi của nó (trong trường hợp trình quản lý kết nối của bạn là một trình đa luồng) hoặc giải phóng trình quản lý kết nối để nó có thể xử lý yêu cầu tiếp theo. " - http://stackoverflow.com/questions/15969037/why-did-the-author-use-entityutils-consumehttpentity – Matt

+0

Ngoài ra: https://hc.apache.org/httpcomponents-client-4.5.x/tutorial/html /fundamentals.html và xem phần 1.1.5 và 1.1.6 giải thích rằng bạn có thể đóng mà không cần tiêu thụ: "Khi làm việc với các thực thể truyền trực tuyến, người ta có thể sử dụng phương thức EntityUtils # consumption (HttpEntity) để đảm bảo rằng nội dung thực thể có Có thể có các tình huống ... khi chỉ một phần nhỏ của toàn bộ nội dung phản hồi cần được truy xuất và hình phạt hiệu suất để tiêu thụ nội dung còn lại và làm cho kết nối có thể tái sử dụng quá cao. ... " – Matt

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