2017-08-04 3 views
3

J'utilise httpClient version 4.5 pour me connecter à notre site de fournisseur externe. Nous n'avons pas besoin de pool de connexion ou de connexion persistante, donc j'utilise BasicHttpClientConnectionManager pour créer le HttpClient.Apache HttpClient 4.5: réinitialisations de connexion

Cela fonctionne très bien pour un nombre minimal de demandes, mais si je le teste pendant 1 heure pour 1TPS, à la fin du test, nous commençons à voir des réinitialisations de connexion intermittentes. (Deviner demande count> 100)

E/S exception (java.net.SocketException) pris lors du traitement de la demande à {s} ->https://apiURL:443: Connection reset

S'il vous plaît trouverez ci-dessous l'extrait de code pour établir la connexion.

SSLContext sslContext = SSLContext.getInstance("TLS"); 
sslContext.init(kmf.getKeyManagers(), new X509TrustManager[] { new DefaultTrustManager() }, new SecureRandom()); 
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, new String[] { "TLSv1.2" }, null,SSLConnectionSocketFactory.getDefaultHostnameVerifier()); 
Registry<ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder.<ConnectionSocketFactory>create() 
       .register("https", sslsf).register("http", new PlainConnectionSocketFactory()).build(); 

HttpClientConnectionManager connectionManager = new BasicHttpClientConnectionManager(socketFactoryRegistry); 
HttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(1, false); 

RequestConfig defaultRequestConfig = RequestConfig.custom().setSocketTimeout(Integer.parseInt(30000)).setConnectTimeout(Integer.parseInt(30000)).setConnectionRequestTimeout(30000).setCookieSpec(CookieSpecs.STANDARD).build(); 

CloseableHttpClient httpClient = HttpClients.custom().setConnectionManager(connectionManager).setDefaultRequestConfig(defaultRequestConfig).setRetryHandler(retryHandler).evictExpiredConnections().build(); 

HttpPost httpPost = new HttpPost(<endpoint>); 
httpPost.setEntity(new UrlEncodedFormEntity(requestData)); 
httpResponse = httpClient.execute(httpPost); 

J'ai vu ce correctif pour un problème similaire signalé est déjà disponible avec la version 4.5. (Ref: https://issues.apache.org/jira/browse/HTTPCLIENT-1655) fourni par Oleg

Si c'est le cas, je ne sais pas pourquoi je suis toujours confronté à ce problème. Quelqu'un pourrait-il m'aider s'il vous plaît?

Merci!

+0

Avez-vous envisagé la possibilité que le point de terminaison opposé réinitialise la connexion? – oleg

+0

Merci pour la réponse, [Oleg] (https://stackoverflow.com/users/335638/oleg). De la trace, nous avons couru avec l'équipe du réseau ici, on voit que la source, qui est notre serveur a envoyé beaucoup de réinitialisations (RST) lorsque l'hôte de destination demande un ACK de notre part. Donc, c'est la raison pour laquelle j'essaie de comprendre si c'est un problème avec le HttpClient que nous utilisons. – user1347244

+0

À ce stade, ce que nous avons fait est d'augmenter le nombre de tentatives à 3 (en utilisant DefaultHttpRequestRetryHandler), car nous avons remarqué que certaines demandes qui ont été touchées par erreur de réinitialisation de connexion sont traitées avec succès après la nouvelle tentative. Mais cela ne semble pas être une solution appropriée au problème auquel nous sommes confrontés. – user1347244

Répondre

2

Salut Oleg,

j'avais utilisé la version 4.5.3 httpclient quand je vois encore la connexion réinitialisée erreurs comme affiché ci-dessus. Par la suite, nous avons remarqué que le correctif pour le problème de réinitialisation était validé pour la version 4.5.1 (https://issues.apache.org/jira/browse/HTTPCLIENT-1655). Donc, juste essayé de mettre à jour cette version particulière, a exécuté un test et ne pas voir la connexion réinitialiser les erreurs plus. Je m'attendais à ce que ce correctif soit également disponible dans les versions supérieures à partir de 4.5.1. Mais, je suppose qu'il a en quelque sorte manqué dans les versions supérieures, ont vérifié que c'est toujours un problème avec la version 4.5.3 à coup sûr. Donc, la conclusion est que l'erreur de réinitialisation de la connexion a été corrigée à l'aide de httpclient 4.5.1 jar.

Merci!

+0

Je le finance un peu difficile à croire mais qu'il en soit ainsi. – oleg

+0

Oui, je ne pensais pas non plus à cette possibilité. Et, je n'aurais pas été si sûr, si je n'avais pas essayé d'exécuter plusieurs tours de test en utilisant des versions différentes. C'était juste un procès, mais je suis heureux de l'avoir réparé. J'espère que vous ajouteriez le correctif aux versions supérieures. – user1347244

+0

Le problème est que je n'ai aucune idée de quoi corriger étant donné que HTTPCLIENT-1655 est présent dans toutes les versions de 4.5.x depuis 4.5.1. J'ai fait une double vérification. – oleg