Nous utilisons le client apache http pour nous connecter à des systèmes auxiliaires externes. Et nous utilisons des commandes Hystrix pour exécuter les requêtes http. Lorsque ces demandes prennent plus de temps pour répondre et que le délai est supérieur au délai d'attente Hystrix, Hystrix renvoie la solution de repli qui est nulle.Libérer la connexion http apache au pool lorsque la réponse est nulle
Puisqu'il renvoie null La réponse HTTP ne peut pas être consommée en utilisant EntityUtils
et donc la connexion n'est pas retournée au pool de connexions.
Nous avons essayé d'utiliser httpGet.releaseConnection
. Mais il semble ne pas fonctionner. Quelle est la meilleure façon de libérer la connexion au pool lorsque la requête http prend plus de temps que prévu?
Hystrix replier
@Override
protected CloseableHttpResponse getFallback() {
logger.error(" Returning fallback");
return null;
}
Code pour exécuter REST requête et le résultat de processus
CloseableHttpClient httpClient = //Get client from pool
HttpGet httpGet = new HttpGet(serverPath);
HystrixTestCommand testCommand = new HystrixTestCommand(httpClient, httpGet);
CloseableHttpResponse httpResponse = testCommand.execute();
if (httpResponse != null
&& httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
//Consule entity
} else if (httpResponse != null
&& httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_OK) {
//Consule entity
} else if(httpResponse == null){
// When http request not responded within anticipated time
httpGet.releaseConnection();
logger.info("Release connection");
return null;
}
Il semble que la connexion soit annulée après l'abandon. Merci –
Mais quelle est la différence entre les méthodes releaseConnection et abort? Tout ce qu'ils font réinitialiser certaines variables atomiques. Comment la mise en œuvre dépend d'eux? –
Ils font à peu près la même chose en ce qui concerne la gestion des ressources. La méthode #abort laisse cependant l'objet request dans un état invalide (avorté), alors que les méthodes #releaseConnection et #reset réinitialisent la requête à son état initial, ce qui permet sa réutilisation et sa ré-exécution. – oleg