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!
Avez-vous envisagé la possibilité que le point de terminaison opposé réinitialise la connexion? – oleg
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
À 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