java tcp jersey jersey-client connection-leaks

java - Restablecimiento de la conexión con Jersey Client



tcp jersey-client (1)

Veo una gran cantidad de restablecimientos de conexión en producción. Puede haber múltiples causas, pero quería asegurarme de que no haya fugas de conexión en el código. Estoy utilizando Jersey Client en el código.

Client this.client = ApacheHttpClient.create(); client.resource("/stores/"+storeId).type(MediaType.APPLICATION_JSON_TYPE).put(ClientResponse.class,indexableStore);

Originalmente estaba instanciando el cliente de la siguiente manera Cliente this.client = Client.create () y lo cambiamos a ApacheHttpClient.create (). No estoy llamando a close () en la respuesta, pero supongo que ApacheHttpClient lo haría internamente cuando se invoque HttpClient executeMethod, que maneja todo el material de la placa de la caldera para nosotros. ¿Podría haber una posible fuga de conexión en la forma en que se escribe el código?


Como dijiste Connection Reset podría deberse a varias razones posibles. Una de estas posibilidades podría ser que el servidor agotó el tiempo de espera al procesar la solicitud, por lo que el cliente recibe restablecimiento de conexión. La sección de comentarios de la pregunta respondida aquí discute las posibles causas del restablecimiento de la conexión en detalle. Una solución posible que puedo pensar es configurar HttpClient para volver a intentar la solicitud en caso de falla. Puede establecer el HttpMethodRetryHandler como a continuación para hacerlo ( Referencia ). Quizás necesite modificar el código según la excepción que reciba.

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