1

我在生产中看到很多连接重置。可能有多种原因,但我想确保代码中没有连接泄漏。我在代码中使用 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 会为我们处理所有样板文件。代码的编写方式可能存在潜在的连接泄漏吗?

4

1 回答 1

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);
于 2014-05-11T03:53:34.780 回答