web-dev-qa-db-fra.com

Quelle est la différence entre setConnectionTimeout, setSoTimeout et "http.connection-manager.timeout" dans l'API Apache HttpClient

Quelle est la différence entre les trois (marqués comme commentaires):

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 - s'il détermine le délai avant l'établissement de la connexion.

2. setSoTimeout - s'il détermine la période d'inactivité ou la différence de temps entre deux paquets consécutifs,

Alors que fait celui ci-dessous:

3. "http.connection-manager.timeout"

42
Prateek

Au niveau le plus bas, HTTP est TCP socket. Ainsi, lorsque vous demandez une URL et obtenez une réponse, au niveau inférieur, un client Socket est créé qui établit une connexion avec le serveur distant Socket, envoie des données et reçoit une réponse.

  • setConnectionTimeout: Le client essaie de se connecter au serveur. Cela indique le temps écoulé avant l'établissement de la connexion ou la réponse du serveur à la demande de connexion.

  • setSoTimeout: Après avoir établi la connexion, le socket client attend la réponse après l'envoi de la demande. Il s'agit du temps écoulé depuis que le client a envoyé une demande au serveur avant que le serveur ne réponde. Veuillez noter que ce n'est pas la même chose que HTTP Error 408 que le serveur envoie au client. En d'autres termes, son période d'inactivité maximale entre deux paquets de données consécutifs arrivant côté client après l'établissement de la connexion.

  • http.connection-manager.timeout: MultiThreadedHttpConnectionManager utilise un pool de connexions HTTP. Il a des valeurs maximale et minimale par ensemble d'hôtes pour cela. Si toutes les connexions pour un hôte particulier ont atteint la valeur maximale, la demande de nouvelle connexion pour le même hôte devra attendre que l'une des connexions existantes devienne libre. Ce paramètre indique le temps écoulé lorsqu'une demande de connexion a été effectuée et avant que HttpConnectionManager ait renvoyé une connexion.

64
Santosh

Ce diagramme de séquence pourrait vous aider.

Apache http api

23
Maria Ines Parnisari

Une explication détaillée est fournie dans Documentation de gestion des connexions sur le site client Apache HTTP.

CoreConnectionPNames.SO_TIMEOUT = 'http.socket.timeout': définit le délai d'expiration du socket (SO_TIMEOUT) en millisecondes, qui est le délai d'attente pour attendre des données ou, autrement dit, une période d'inactivité maximale entre deux paquets de données consécutifs). Une valeur de temporisation de zéro est interprétée comme une temporisation infinie. Ce paramètre attend une valeur de type Java.lang.Integer. Si ce paramètre n'est pas défini, les opérations de lecture n'expireront pas (délai infini).

CoreConnectionPNames.CONNECTION_TIMEOUT = 'http.connection.timeout': détermine le délai d'expiration en millisecondes jusqu'à ce qu'une connexion soit établie. Une valeur de temporisation de zéro est interprétée comme une temporisation infinie. Ce paramètre attend une valeur de type Java.lang.Integer. Si ce paramètre n'est pas défini, les opérations de connexion n'expireront pas (délai infini).

le délai d'expiration de Connection Manager (http.connection-manager.timeout) - le temps d'attente d'une connexion à partir du gestionnaire/pool de connexions

Juste pour info

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

est une autre façon de faire

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

En termes simples:

  • délai d'expiration de la connexion: la limite de temps que votre application attend lorsqu'elle essaie d'établir une connexion avec le serveur et n'est pas en mesure de le faire (l'adresse est incorrecte ou le serveur est en panne, etc.)
  • Socket time out: la limite de temps que votre application attend après avoir été connectée au serveur mais toujours en attente d'une réponse (un retard peut être causé par un blocage du serveur par exemple)
  • Délai d'expiration du gestionnaire de connexions: la limite de temps pendant laquelle une demande attend lorsqu'elle se trouve dans la file d'attente en attendant que l'une des demandes du pool soit libérée. En d'autres termes, en HTTP, nous avons un pool de connexions avec une taille maximale. Lorsqu'il y a une charge sur l'application, le pool peut être plein et toute nouvelle demande doit attendre la fin d'une autre demande du pool.
2
user666