2013-08-12 20 views
31

sự khác biệt giữa ba (đánh dấu là ý kiến) là gì là gì:phần chênh lệch giữa setConnectionTimeout, setSoTimeout và "http.connection-manager.timeout" trong apache HttpClient API

MultiThreadedHttpConnectionManager connManag = new MultiThreadedHttpConnectionManager(); 
HttpConnectionManagerParams managParams = connManag.getParams(); 

managParams.setConnectionTimeout(connectiontimeout); // 1 
managParams.setSoTimeout(sotimeout); //2 

HttpMethodBase baseMethod = null; 

try { 
    HttpClient client = new HttpClient(connManag); 
    client.getParams().setParameter("http.connection-manager.timeout", poolTimeout); //3 

    baseMethod = new GetMethod(…); 
    int statusCode = client.executeMethod(…); 

    … 
} 
catch (ConnectTimeoutException cte){ 
    //Took too long to connect to remote host 
} 
catch (SocketTimeoutException ste){ 
    //Remote host didn’t respond in time 
} 
catch (Exception se){ 
    //Some other error occurred 
} 
finally { 
    if (baseMethod != null) 
    baseMethod.releaseConnection(); 
} 

1. setConnectionTimeout - nếu nó xác định thời gian chờ cho đến khi kết nối được thiết lập.

2. setSoTimeout - nếu nó quyết định khoảng thời gian không hoạt động hoặc chênh lệch thời gian giữa hai gói liên tiếp,

Sau đó, những gì hiện hình dưới đây làm:

3. "http.connection-manager.timeout"

+0

Tài liệu nói gì? Họ có im lặng không? –

+0

@Marko Không thể đánh giá thấp thats lý do tại sao được đăng ở đây – Prateek

+0

Bạn nên ít nhất đề cập đến rằng bạn đã đọc chúng, và chỉ ra các khía cạnh cụ thể mà rắc rối bạn. Bằng cách này, câu hỏi của bạn có vẻ như bạn chỉ yêu cầu chúng tôi đọc tài liệu cho bạn. –

Trả lời

50

Tại HTTP mức thấp nhất là TCP ổ cắm . Vì vậy, khi bạn yêu cầu một URL và nhận được một phản ứng, ở mức thấp hơn, một Socket của khách hàng được tạo ra để thiết lập kết nối đến Socket Server từ xa, gửi một số dữ liệu và nhận phản hồi.

  • setConnectionTimeout: Khách hàng cố gắng để kết nối với máy chủ. Điều này biểu thị thời gian trôi qua trước khi kết nối được thiết lập hoặc Máy chủ phản hồi yêu cầu kết nối.

  • setSoTimeout: Sau khi thiết lập kết nối, ổ cắm khách chờ phản hồi sau khi gửi yêu cầu. Đây là thời gian trôi qua kể từ khi khách hàng đã gửi yêu cầu đến máy chủ trước khi máy chủ phản hồi. Xin lưu ý rằng điều này không giống như HTTP Error 408 mà máy chủ gửi cho khách hàng. Nói cách khác, không hoạt động trong khoảng thời gian tối đa giữa hai gói dữ liệu liên tiếp đến phía máy khách sau khi kết nối được thiết lập.

  • http.connection-manager.timeout: MultiThreadedHttpConnectionManager sử dụng một hồ bơi các kết nối HTTP. Nó có giá trị tối đa và tối thiểu cho mỗi máy chủ được đặt cho nó. Nếu tất cả các kết nối cho máy chủ lưu trữ cụ thể đã đạt đến giá trị tối đa, yêu cầu kết nối mới cho cùng một máy chủ sẽ phải đợi cho đến khi bất kỳ kết nối hiện có nào trở nên miễn phí. Tham số này biểu thị thời gian đã trôi qua khi yêu cầu kết nối được thực hiện và trước khi HttpConnectionManager trả lại kết nối.

+0

để điều đó có nghĩa là chúng tôi phải đóng một trong hai ổ cắm hoặc kết nối – Prateek

+0

Khi bạn xử lý các API như 'HttpClient', bạn không phải xử lý trực tiếp ổ cắm. Ngay cả trong trường hợp 'HttpClient' có một phương thức (' httpclient.getConnectionManager(). Shutdown(); ') để tắt' HttpClient' rất thực hiện công việc đóng các kết nối. – Santosh

+0

nhưng tôi không phải đóng kết nối như tôi đang làm kết nối pooling.what tôi nên làm gì để ngừng chờ đợi một phản ứng cho một yêu cầu. – Prateek

5

Giải thích chi tiết được cung cấp trong Connection management documentation trên trang web khách hàng Apache HTTP.

CoreConnectionPNames.SO_TIMEOUT = 'http.socket.timeout': xác định thời gian chờ ổ cắm (SO_TIMEOUT) trong mili giây, đó là thời gian chờ đợi cho dữ liệu hoặc, đặt cách khác nhau, một thời gian không hoạt động tối đa giữa hai liên tiếp gói dữ liệu). Giá trị thời gian chờ bằng 0 được hiểu là thời gian chờ vô hạn. Tham số này mong đợi một giá trị của kiểu java.lang.Integer. Nếu tham số này không được thiết lập, hoạt động đọc sẽ không hết thời gian chờ (vô hạn thời gian chờ).

CoreConnectionPNames.CONNECTION_TIMEOUT = 'http.connection.timeout': xác định thời gian chờ bằng mili giây cho đến khi kết nối được thiết lập. Giá trị thời gian chờ bằng 0 được hiểu là thời gian chờ vô hạn. Tham số này mong đợi một giá trị của kiểu java.lang.Integer. Nếu tham số này không được thiết lập, các hoạt động kết nối sẽ không hết thời gian chờ (vô hạn thời gian chờ).

các Connection Manager Timeout (http.connection-manager.timeout) - thời gian để chờ đợi cho một kết nối từ người quản lý kết nối/hồ bơi

Chỉ cần cho các hồ sơ

HttpParams httpParams = httpClient.getParams(); 
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000); 
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000); 

là cách thay thế để làm

HttpParams httpParams = httpClient.getParams(); 
HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000); 
HttpConnectionParams.setSoTimeout(httpParams, timeout * 1000); 

(.210)

0

Nói cách đơn giản: thời gian

  • kết nối ra: giới hạn của thời gian ứng dụng của bạn chờ đợi khi cố gắng thiết lập kết nối với máy chủ và không có khả năng (địa chỉ là sai, hoặc máy chủ bị hỏng ...)
  • Thời gian chờ của thiết bị: giới hạn thời gian mà ứng dụng của bạn chờ sau khi kết nối với máy chủ nhưng vẫn đang chờ phản hồi (ví dụ: trì hoãn có thể do máy chủ treo gây ra)
  • Kết nối quản lý thời gian chờ: giới hạn thời gian yêu cầu chờ đợi khi trong hàng chờ đợi một trong các yêu cầu trong t anh ta sẽ được giải phóng. Nói cách khác, trong HTTP chúng ta có một nhóm các kết nối với kích thước tối đa. Khi có tải trên ứng dụng, hồ bơi có thể đầy và mọi yêu cầu mới phải đợi yêu cầu khác từ hồ bơi đến khi hoàn tất.
0

Biểu đồ trình tự này có thể hữu ích.

sequence diagram for timeouts

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