Освободить http-соединение apache с пулом, когда ответ равен нулю

Мы используем http-клиент apache для подключения к внешним вспомогательным системам. И мы используем команды Hystrix для выполнения http-запросов. Когда для ответа на эти запросы требуется больше времени и время превышает тайм-аут Hystrix, Hystrix вернет резервный вариант, который равен нулю.

Поскольку он возвращает нулевой ответ Http, его нельзя использовать с помощью EntityUtils, и, следовательно, соединение не возвращается в пул соединений.

Мы пытались использовать httpGet.releaseConnection. Но, похоже, это не работает.

Каков наилучший способ вернуть соединение обратно в пул, когда HTTP-запрос требует больше времени для ответа, чем ожидалось?

Хайстрикс отступает

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

Код для выполнения запроса REST и обработки результата

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

person Dheeraj Joshi    schedule 07.09.2017    source источник


Ответы (1)


HttpClient автоматически освобождает все ресурсы в случае возникновения исключения в ходе выполнения запроса или в случае прерывания запроса вызывающей стороной. Вы можете выполнить HttpGet#abort, чтобы завершить запрос и обеспечить освобождение связанных с ним ресурсов.

person ok2c    schedule 07.09.2017
comment
Похоже, что после прерывания соединение разрывается. Спасибо - person Dheeraj Joshi; 08.09.2017
comment
Но в чем разница между методами releaseConnection и abort? Все они сбрасывают некоторые переменные Atomic. Насколько реализация зависит от них? - person Dheeraj Joshi; 08.09.2017
comment
Они в значительной степени делают то же самое, что касается управления ресурсами. Однако метод #abort оставляет объект запроса в недопустимом (прерванном) состоянии, в то время как методы #releaseConnection и #reset сбрасывают запрос в исходное состояние, что позволяет его повторное использование и повторное выполнение. - person ok2c; 08.09.2017
comment
Идеальный. Теперь понятно. Еще раз спасибо за разъяснения. Эти различия где-то задокументированы? Особенно, когда используются пулы, становится необходимым, чтобы код, который вызывает http-клиент, вызывал все эти методы, чтобы соединение было освобождено для пула. - person Dheeraj Joshi; 08.09.2017