¿Cómo puedo reutilizar una HttpClient conexión de manera eficiente?

Estoy haciendo HTTP Puestos muy frecuentemente (>= 1/seg) a un extremo de API y quiero asegurarme de que estoy haciendo de manera eficiente. Mi objetivo es tener éxito o fracasar, tan pronto como sea posible, especialmente desde que se han separado de código de reintentos fallidos Puestos. Hay una buena página de HttpClient consejos de rendimiento, pero no estoy seguro de si exhaustivamente la aplicación de todos ellos va a tener beneficios reales. Aquí está mi código de derecho ahora:

public class Poster {
  private String url;
  //re-use our request
  private HttpClient client;
  //re-use our method
  private PostMethod method;

  public Poster(String url) {
    this.url = url;

    //Set up the request for reuse.
    HttpClientParams clientParams = new HttpClientParams();
    clientParams.setSoTimeout(1000);  //1 second timeout.
    this.client = new HttpClient(clientParams);
    //don't check for stale connections, since we want to be as fast as possible?
    //this.client.getParams().setParameter("http.connection.stalecheck", false);

    this.method = new PostMethod(this.url);
    //custom RetryHandler to prevent retry attempts
    HttpMethodRetryHandler myretryhandler = new HttpMethodRetryHandler() {
      public boolean retryMethod(final HttpMethod method, final IOException exception, int executionCount) {
        //For now, never retry
        return false;
      }
    };

    this.method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, myretryhandler);
  }

  protected boolean sendData(SensorData data) {
    NameValuePair[] payload = {
      //...
    };
    method.setRequestBody(payload);

    //Execute it and get the results.
    try {
      //Execute the POST method.
      client.executeMethod(method);
    } catch (IOException e) {
      //unable to POST, deal with consequences here
      method.releaseConnection();
      return false;
    }

    //don't release so that it can be reused?
    method.releaseConnection();

    return method.getStatusCode() == HttpStatus.SC_OK;
  }
}

Tendría sentido para deshabilitar la comprobación de rancio conexiones? Debo estar buscando en el uso de la MultiThreadedConnectionManager? Por supuesto, el real de la evaluación comparativa de ayuda pero quería comprobar si mi código es en la pista de la derecha primero.

Es irónico que yo ganaba la Pregunta Popular insignia (1000+ vistas) a pesar de que no hay respuestas. Si usted tiene algunas sugerencias, responder a esta podría ser una buena manera de ganar algo de reputación. 😉
hc.apache.org/httpcomponents-client-ga/tutorial/html/…

OriginalEl autor pr1001 | 2010-02-10

1 Kommentar

  1. 5

    Gran parte de la disminución del rendimiento de las conexiones http es el establecimiento de la conexión de socket. Usted puede evitar esto mediante el uso de «keep-alive’ de conexiones http. Para ello, lo mejor es usar HTTP 1.1 y asegúrese de que «Content-Length: xx» siempre se establece en las solicitudes y respuestas, «Connecction: cerrar» está ajustado correctamente cuando sea apropiado y de que está bien actuado a la hora de recibido.

    OriginalEl autor karmakaze

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea