Сброс соединения с клиентом Джерси

Я вижу много переустановок подключений в производственной среде. Причин может быть несколько, но я хотел убедиться, что в коде нет утечек подключений. Я использую в коде клиент 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);
Другие вопросы по тегам