簡體   English   中英

apache HttpClient API中的setConnectionTimeout,setSoTimeout和“http.connection-manager.timeout”之間有什么區別

[英]What is the difference between the setConnectionTimeout , setSoTimeout and “http.connection-manager.timeout” in 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 - 如果確定連接建立之前的超時。

2. setSoTimeout - 如果它確定兩個連續數據包之間的不活動時間或時間差,

然后下面做了什么:

3. "http.connection-manager.timeout"

在最低級別,HTTP是TCP套接字。 因此,當您請求URL並獲得響應時,在較低級別創建一個客戶端Socket,它建立與遠程服務器套接字的連接,發送一些數據並接收響應。

  • setConnectionTimeout :客戶端嘗試連接到服務器。 這表示建立連接或服務器響應連接請求之前經過的時間。

  • setSoTimeout :建立連接后,客戶端套接字在發送請求后等待響應。 這是自客戶端在服務器響應之前向服務器發送請求以來經過的時間。 請注意,這與服務器發送給客戶端的HTTP Error 408 換句話說,在建立連接之后到達客戶端側的兩個連續數據分組之間的最大周期不活動

  • http.connection-manager.timeoutMultiThreadedHttpConnectionManager使用HTTP連接池 它為每個主機設置了最大值和最小值。 如果特定主機的所有連接都已達到最大值,則同一主機的新連接請求必須等到任何一個現有連接變為空閑。 此參數表示在發出連接請求時和HttpConnectionManager返回連接之前經過的時間。

此序列圖可能會有所幫助。

apache http api

Apache HTTP客戶端站點上的連接管理文檔中提供了詳細說明。

CoreConnectionPNames.SO_TIMEOUT ='http.socket.timeout':定義套接字超時(SO_TIMEOUT),以毫秒為單位,即等待數據的超時, 換句話說 ,兩個連續數據包之間的最大周期不活動。 超時值為零被解釋為無限超時。 此參數需要java.lang.Integer類型的值。 如果未設置此參數,則讀取操作不會超時(無限超時)。

CoreConnectionPNames.CONNECTION_TIMEOUT ='http.connection.timeout':確定建立連接之前的超時(以毫秒為單位)。 超時值為零被解釋為無限超時。 此參數需要java.lang.Integer類型的值。 如果未設置此參數,則連接操作不會超時(無限超時)。

連接管理器超時(http.connection-manager.timeout) - 等待連接管理器/池連接的時間

僅供記錄

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

是另一種方式

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

簡單來說:

  • 連接超時:應用程序在嘗試與服務器建立連接時等待的時間限制(無法解決,或者服務器已關閉等等)
  • 套接字超時:應用程序在連接到服務器但等待響應后等待的時間限制(例如,掛起服務器可能導致延遲)
  • 連接管理器超時:請求在隊列中等待釋放池中的一個請求時等待的時間限制。 換句話說,在HTTP中,我們有一個最大大小的連接池。 當應用程序上有負載時,池可能已滿,任何新請求必須等待池中的另一個請求完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM