Frage

Ich tue HTTP POSTs sehr häufig (> = 1 / sec) mit einem API-Endpunkt und ich möchte sicherstellen, dass es effizient ich tue. Mein Ziel ist es, so bald wie möglich Erfolg haben oder scheitern, zumal ich separaten Code verkannt POSTs erneut zu versuchen. Es gibt eine schöne Seite von Httpclient-Performance-Tipps , aber ich bin nicht sicher, ob erschöpfend sie alle der Umsetzung wird das reale Vorteile. Hier ist mein Code jetzt:

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

Wäre es sinnvoll, die Überprüfung auf veraltete Verbindungen zu deaktivieren? Soll ich suche die MultiThreadedConnectionManager bei Verwendung? Natürlich wäre tatsächlich Benchmarking helfen, aber ich wollte überprüfen, ob mein Code auf dem richtigen Weg ist zuerst.

War es hilfreich?

Lösung

Ein großer Teil der Leistung getroffen von HTTP-Verbindungen wird die Socket-Verbindung hergestellt wird. Sie können dies vermeiden, indem Sie ‚Keep-Alive‘ http-Verbindungen. Um dies zu tun, ist es am besten nutzen HTTP 1.1 und stellen Sie sicher, dass „Content-Length: xx“ wird in Anfragen und Antworten immer gesetzt. „Connecction: close“ richtig eingestellt ist, wenn angemessen und richtig beaufschlagten, wenn sie empfangen

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top