2017-09-07 1 views
1

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; 
} 

Répondre

2

HttpClient libère automatiquement toutes les ressources en cas d'exception levée dans le cadre de l'exécution de la demande ou en cas de demande d'être abandonnée par l'appelant. Vous pouvez faire HttpGet#abort pour terminer la demande et assurer la désaffectation des ressources qui y sont associées.

+0

Il semble que la connexion soit annulée après l'abandon. Merci –

+0

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? –

+1

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