12

मैं एक एपीआई एंडपॉइंट पर HTTP POSTs अक्सर (> = 1/सेकंड) कर रहा हूं और मैं यह सुनिश्चित करना चाहता हूं कि मैं इसे कुशलता से कर रहा हूं। मेरा लक्ष्य सफल होने या जल्द से जल्द असफल होना है, खासकर जब से मेरे पास असफल POSTs को पुनः प्रयास करने के लिए अलग कोड है। HttpClient performance tips का एक अच्छा पृष्ठ है, लेकिन मुझे यकीन नहीं है कि अगर उन्हें पूरी तरह कार्यान्वित करना है तो सभी के पास वास्तविक लाभ होंगे। यहां मेरा कोड अभी है:मैं एक 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 का उपयोग करना चाहिए? बेशक, वास्तविक बेंचमार्किंग मदद करेगी लेकिन मैं यह जांचना चाहता था कि मेरा कोड पहले सही रास्ते पर है या नहीं।

+4

यह विडंबना है कि मैंने कोई जवाब नहीं होने के बावजूद लोकप्रिय प्रश्न बैज अर्जित किया (1000+ विचार)। यदि आपके पास कुछ सुझाव हैं, तो इसका उत्तर देना कुछ प्रतिष्ठा कमाने का एक अच्छा तरीका हो सकता है। ;-) – pr1001

+0

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

उत्तर

5

http कनेक्शन का अधिकांश प्रदर्शन हिट कनेक्शन स्थापित कर रहा है। आप 'keep-live' http कनेक्शन का उपयोग कर इससे बच सकते हैं। ऐसा करने के लिए, HTTP 1.1 का उपयोग करना सबसे अच्छा है और सुनिश्चित करें कि "सामग्री-लंबाई: xx" हमेशा अनुरोधों और प्रतिक्रियाओं में सेट होता है, "कनेक्शन: बंद करें" उपयुक्त होने पर सही ढंग से सेट किया जाता है और प्राप्त होने पर उचित तरीके से कार्य किया जाता है।

संबंधित मुद्दे

 संबंधित मुद्दे