2010-07-02 8 views
3

J'ai un code similaire à ce qui suit:Pourquoi HttpClient jeter un SocketTimeoutException lors de l'exécution POST

try { 
    HttpPost post = new HttpPost(httpsUrl); 
    setHeaders(post); 

    HttpEntity entity = new StringEntity(request, "UTF-8"); 

    post.setEntity(entity); 

    HttpResponse response = httpclient.execute(post); 
    String result = EntityReader.readContent(response.getEntity()); 
    checkAnswer(result); 
    return result; 

} catch (Exception e) { 
    throw new ZapException("Error executing the http post request: "+e.getMessage(), e); 
} 

Il envoie le contenu de request à un serveur via POST en utilisant une instance de httpclient qui aurait déjà été utilisé auparavant (il a des connexions persistantes activées, puisque nous envoyons pas mal de requêtes au même serveur ...).

Cette parfois échoue avec un SocketTimeoutException avec "Read expired" comme message. Ce n'est pas clair pour nous, pourquoi cela ne marche que quelques fois, quand la plupart du temps ça ne marche pas. Ce qui donne?

+0

J'ai un problème similaire lorsque vous envoyez plusieurs requêtes à solr w/tomcat 7. à quoi envoyez-vous les demandes? Quels sont les détails de votre serveur puisque c'est là que les erreurs proviennent de –

+0

Je pense que c'était Jetty 6. Mais c'était il y a pas mal de temps ... – kungfoo

Répondre

1

Dans ce qui suit, je suppose que vous utilisez Apache Commons HttpClient (org.apache.commons.httpclient.HttpClient).

Peut-être que vous obtenez un SocketTimeoutException simplement parce que, occasionnellement, l'hôte avec lequel votre instance HttpClient communique prend trop de temps à répondre, déclenchant la routine d'annulation de HttpClient. Vous pouvez augmenter le délai d'attente de connexion et le délai d'attente de prise avec le

HttpConnectionParams params = httpclient.getHttpConnectionManager().getParams(); 
params.setConnectionTimeout(20000); 
params.setSoTimeout(15000); 

Aditionally, si vous faites face à des délais d'expiration suivante, malgré l'augmentation des limites de délai d'attente, il est une bonne pratique pour gérer le SocketTimeoutException gracieusement - par exemple, en réitérant la connexion une deuxième et une troisième fois.