2017-09-07 83 views
1

我們使用apache http客戶端連接到外部幫助系統。我們使用Hystrix命令來執行http請求。 當這些請求需要更多時間來響應並且時間超過Hystrix超時時,Hystrix將返回爲空的回退。當響應爲空時釋放apache http連接到池

由於它返回null使用EntityUtils不能消耗Http響應,因此連接不會返回到連接池。

我們嘗試過使用httpGet.releaseConnection。但它似乎不起作用。

當http請求比預期時間需要更多時間響應時,釋放連接回池的最佳方式是什麼?

蝟回落

@Override 
protected CloseableHttpResponse getFallback() { 
    logger.error(" Returning fallback"); 
    return null; 
} 

代碼來執行

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

回答

2

的HttpClient會自動釋放所有資源在請求執行的過程中引發的任何異常的情況下,或在以下情況下REST查詢和處理結果請求被調用者中止。您可以執行HttpGet#abort來終止請求並確保取消與其關聯的資源。

+0

它似乎在中止後釋放連接。謝謝 –

+0

但是releaseConnection和abort方法有什麼區別? 他們確實重置了一些原子變量。實施依賴於他們? –

+1

就資源管理而言,他們幾乎做同樣的事情。但是,#abort方法會將請求對象留在無效(中止)狀態,而#releaseConnection和#reset方法會將請求重置爲其初始狀態,從而使其可以重新使用和重新執行。 – oleg