Сброс соединения с клиентом Джерси
Я вижу много переустановок подключений в производственной среде. Причин может быть несколько, но я хотел убедиться, что в коде нет утечек подключений. Я использую в коде клиент Jersey
Client this.client = ApacheHttpClient.create();
client.resource("/stores/"+storeId).type(MediaType.APPLICATION_JSON_TYPE).put(ClientResponse.class,indexableStore);
Первоначально я создавал экземпляр клиента следующим образом: Client this.client = Client.create(), и мы изменили его на ApacheHttpClient.create(). Я не вызываю close() для ответа, но я предполагаю, что ApacheHttpClient будет делать это внутренне, так как HttpClient executeMethod вызывается, который обрабатывает все вещи вспомогательной платформы для нас. Может ли быть потенциальная утечка соединения при написании кода?
1 ответ
Как ты говорил Connection Reset
может быть вызвано многими возможными причинами. Одной из таких возможностей может быть тайм-аут сервера во время обработки запроса, поэтому клиент получает сброс соединения. В разделе комментариев к ответу на этот вопрос подробно обсуждаются возможные причины сброса соединения. Одно из возможных решений, которое я могу придумать, - это настроить HttpClient
повторить запрос в случае сбоя. Вы могли бы установить HttpMethodRetryHandler
как ниже, чтобы сделать это ( ссылка). Возможно, вам придется изменить код в зависимости от полученного вами исключения.
HttpMethodRetryHandler retryHandler = new HttpMethodRetryHandler()
{
public boolean retryMethod(
final HttpMethod method,
final IOException exception,
int executionCount)
{
if (executionCount >= 5)
{
// Do not retry if over max retry count
return false;
}
if (exception instanceof NoHttpResponseException)
{
// Retry if the server dropped connection on us
return true;
}
if (!method.isRequestSent())
{
// Retry if the request has not been sent fully or
// if it's OK to retry methods that have been sent
return true;
}
// otherwise do not retry
return false;
}
};
ApacheHttpClient client = ApacheHttpClient.create();
HttpClient hc = client.getClientHandler().getHttpClient();
hc.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, retryHandler);
client.resource("/stores/"+storeId).type(MediaType.APPLICATION_JSON_TYPE).put(ClientResponse.class,indexableStore);