Как эффективно использовать соединение HttpClient? - PullRequest
12 голосов
/ 10 февраля 2010

Я очень часто выполняю HTTP POST (> = 1 / сек) для конечной точки API и хочу убедиться, что я делаю это эффективно. Моя цель - добиться успеха или провала как можно скорее, тем более что у меня есть отдельный код для повторения неудачных POST. Есть хорошая страница советов по производительности HttpClient , но я не уверен, что их всестороннее внедрение принесет реальную пользу. Вот мой код прямо сейчас:

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

Имеет ли смысл отключить проверку устаревших соединений? Стоит ли смотреть на использование MultiThreadedConnectionManager ? Конечно, реальный бенчмаркинг мог бы помочь, но я хотел сначала проверить, правильно ли работает мой код.

1 Ответ

5 голосов
/ 19 мая 2011

Большая часть снижения производительности http-соединений - это установление сокет-соединения.Вы можете избежать этого, используя http-соединения «keep-alive».Для этого лучше всего использовать HTTP 1.1 и убедиться, что «Content-Length: xx» всегда задается в запросах и ответах, «Connecction: close» правильно устанавливается, когда это необходимо, и правильно обрабатывается при получении.

...