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