2010-02-10 41 views
12

Tôi đang thực hiện các POST HTTP rất thường xuyên (> = 1/giây) đến một điểm cuối API và tôi muốn đảm bảo rằng tôi đang thực hiện nó một cách hiệu quả. Mục tiêu của tôi là thành công hay thất bại càng sớm càng tốt, đặc biệt là vì tôi có mã riêng để thử lại các POST không thành công. Có một trang đẹp của HttpClient performance tips, nhưng tôi không chắc chắn nếu thực hiện đầy đủ tất cả chúng sẽ có lợi ích thực sự. Đây là mã của tôi ngay bây giờ:Làm thế nào tôi có thể sử dụng lại kết nối HttpClient một cách hiệu quả?

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

Bạn nên vô hiệu hóa việc kiểm tra kết nối cũ? Tôi có nên xem xét sử dụng MultiThreadedConnectionManager không? Tất nhiên, điểm chuẩn thực tế sẽ giúp ích nhưng tôi muốn kiểm tra xem mã của tôi có đi đúng hướng hay không.

+4

Thật mỉa mai là tôi đã giành được huy hiệu Câu hỏi phổ biến (hơn 1000 lượt xem) mặc dù không có câu trả lời. Nếu bạn có một số gợi ý, trả lời điều này có thể là một cách hay để kiếm được một số danh tiếng. ;-) – pr1001

+0

https://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html –

Trả lời

5

Phần lớn lượt truy cập hiệu suất của các kết nối http đang thiết lập kết nối socket. Bạn có thể tránh điều này bằng cách sử dụng các kết nối http 'keep-alive'. Để thực hiện điều này, tốt nhất bạn nên sử dụng HTTP 1.1 và đảm bảo rằng "Content-Length: xx" luôn được đặt trong yêu cầu và phản hồi, "Connecction: close" được đặt chính xác khi thích hợp và được thực hiện đúng khi nhận được.

Các vấn đề liên quan