2013-08-12 12 views
31

में setConnectionTimeout, setSoTimeout और "http.connection-manager.timeout" के बीच अंतर क्या तीन के बीच का अंतर (टिप्पणी के रूप में चिह्नित) है:क्या Apache httpclient एपीआई

MultiThreadedHttpConnectionManager connManag = new MultiThreadedHttpConnectionManager(); 
HttpConnectionManagerParams managParams = connManag.getParams(); 

managParams.setConnectionTimeout(connectiontimeout); // 1 
managParams.setSoTimeout(sotimeout); //2 

HttpMethodBase baseMethod = null; 

try { 
    HttpClient client = new HttpClient(connManag); 
    client.getParams().setParameter("http.connection-manager.timeout", poolTimeout); //3 

    baseMethod = new GetMethod(…); 
    int statusCode = client.executeMethod(…); 

    … 
} 
catch (ConnectTimeoutException cte){ 
    //Took too long to connect to remote host 
} 
catch (SocketTimeoutException ste){ 
    //Remote host didn’t respond in time 
} 
catch (Exception se){ 
    //Some other error occurred 
} 
finally { 
    if (baseMethod != null) 
    baseMethod.releaseConnection(); 
} 

1. setConnectionTimeout - अगर यह कनेक्शन स्थापित होने तक टाइमआउट निर्धारित करता है।

2. setSoTimeout - अगर यह निष्क्रियता या लगातार दो पैकेट के बीच समय अंतर की अवधि,

तो क्या नीचे एक करता है निर्धारित करता है:

3. "http.connection-manager.timeout"

+0

दस्तावेज़ क्या कहते हैं? क्या वे चुप हैं? –

+0

@ मार्को इस बात को समझने में सक्षम नहीं है कि यहां क्यों पोस्ट किया गया – Prateek

+0

आपको कम से कम उल्लेख करना चाहिए कि आपने उन्हें पढ़ा है, और उन विशेष पहलुओं को इंगित करें जो आपको परेशान करते हैं। इस तरह आपका प्रश्न ऐसा लगता है कि आप हमें सिर्फ आपके लिए दस्तावेज़ पढ़ने के लिए कह रहे हैं। –

उत्तर

50

निम्नतम स्तर HTTP पर TCP सॉकेट है । तो जब आप एक यूआरएल का अनुरोध करते हैं और प्रतिक्रिया प्राप्त करते हैं, निचले स्तर पर, क्लाइंट सॉकेट बनाया जाता है जो रिमोट सर्वर सॉकेट से कनेक्शन स्थापित करता है, कुछ डेटा भेजता है और प्रतिक्रिया प्राप्त करता है।

  • setConnectionTimeout: ग्राहक सर्वर से कनेक्ट करने की कोशिश करता है। यह कनेक्शन स्थापित होने से पहले समाप्त होने वाले समय को इंगित करता है या सर्वर कनेक्शन अनुरोध का जवाब देता है।

  • setSoTimeout: कनेक्शन स्थापित करने के बाद, क्लाइंट सॉकेट अनुरोध भेजने के बाद प्रतिक्रिया के लिए प्रतीक्षा करता है। सर्वर समाप्त होने से पहले क्लाइंट ने सर्वर से अनुरोध भेजा है क्योंकि यह समय बीत चुका है। कृपया ध्यान दें कि यह HTTP Error 408 जैसा नहीं है जो सर्वर क्लाइंट को भेजता है। दूसरे शब्दों में इसकी अधिकतम अवधि निष्क्रियता कनेक्शन स्थापित होने के बाद ग्राहक पक्ष पर आने वाले दो लगातार डेटा पैकेट के बीच है।

  • http.connection-manager.timeout: MultiThreadedHttpConnectionManager HTTP कनेक्शन के पूल का उपयोग करता है। इसमें प्रति होस्ट सेट अधिकतम और न्यूनतम मान हैं। यदि विशेष होस्ट के लिए सभी कनेक्शन अधिकतम मूल्य तक पहुंच गए हैं, तो उसी होस्ट के लिए नए कनेक्शन के अनुरोध को तब तक इंतजार करना होगा जब तक कि मौजूदा कनेक्शन में से कोई भी मुक्त न हो जाए। यह पैरामीटर कनेक्शन कनेक्शन अनुरोध करते समय समाप्त होने वाले समय को इंगित करता है और HttpConnectionManager से पहले एक कनेक्शन लौटाता है।

+0

तो इसका मतलब है कि हमें सॉकेट या कनेक्शन – Prateek

+0

बंद करना होगा जब आप 'एचटीपी क्लाइंट' जैसी एपीआई से निपटते हैं, तो आपको सीधे सॉकेट से निपटने की ज़रूरत नहीं है। यहां तक ​​कि 'HttpClient' के मामले में एक विधि ('httpclient.getConnectionManager()। शटडाउन();') को' HttpClient' को बंद करने के लिए कनेक्शन है जो कनेक्शन को बंद करने का काम करता है। – Santosh

+0

लेकिन मुझे कनेक्शन बंद करना नहीं है क्योंकि मैं कनेक्शन पूलिंग कर रहा हूं। मुझे अनुरोध के जवाब की प्रतीक्षा रोकने के लिए क्या करना चाहिए। – Prateek

5

अपाचे HTTP क्लाइंट साइट पर Connection management documentation में विस्तृत स्पष्टीकरण प्रदान किया गया है।

CoreConnectionPNames.SO_TIMEOUT = 'http.socket.timeout': सॉकेट टाइमआउट मिलीसेकेंड में (SO_TIMEOUT) है, जो लगातार दो के बीच डाटा के लिए इंतज़ार कर या अलग रखा, अधिकतम अवधि की निष्क्रियता के लिए समय समाप्ति है परिभाषित करता है डेटा पैकेट)। शून्य का टाइमआउट मान एक अनंत टाइमआउट के रूप में व्याख्या किया जाता है। यह पैरामीटर java.lang.Integer प्रकार के मान की अपेक्षा करता है। यदि यह पैरामीटर सेट नहीं है, तो पढ़ें ऑपरेशन समय समाप्त नहीं होगा (अनंत टाइमआउट)।

CoreConnectionPNames.CONNECTION_TIMEOUT = 'http.connection.timeout': कनेक्शन स्थापित होने तक मिलीसेकंड में टाइमआउट निर्धारित करता है। शून्य का टाइमआउट मान एक अनंत टाइमआउट के रूप में व्याख्या किया जाता है। यह पैरामीटर java.lang.Integer प्रकार के मान की अपेक्षा करता है। यदि यह पैरामीटर सेट नहीं है, तो कनेक्ट ऑपरेशन का समय समाप्त नहीं होगा (अनंत टाइमआउट)।

कनेक्शन प्रबंधक टाइम आउट (http.connection-manager.timeout) - समय कनेक्शन प्रबंधक से एक कनेक्शन की प्रतीक्षा/पूल

बस रिकॉर्ड

HttpParams httpParams = httpClient.getParams(); 
httpParams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, timeout * 1000); 
httpParams.setParameter(CoreConnectionPNames.SO_TIMEOUT, timeout * 1000); 

के लिए

HttpParams httpParams = httpClient.getParams(); 
HttpConnectionParams.setConnectionTimeout(httpParams, timeout * 1000); 
HttpConnectionParams.setSoTimeout(httpParams, timeout * 1000); 

() करने का वैकल्पिक तरीका है 493,210)

0

सरल शब्दों में:

  • कनेक्शन समय बाहर: जब सर्वर से कनेक्शन स्थापित करने की कोशिश कर रहा है और करने में सक्षम नहीं है के लिए समय आपके आवेदन इंतजार कर रहा है की सीमा (पता गलत है, या सर्वर डाउन आदि है ...)
  • सॉकेट समय बाहर: के बाद सर्वर से कनेक्ट किया जा रहा है लेकिन अभी भी (देरी उदाहरण के लिए सर्वर फांसी की वजह से हो सकता है) प्रतिक्रिया की प्रतीक्षा करने
  • कनेक्शन के लिए समय की प्रतीक्षा करता है आपके आवेदन की सीमा प्रबंधक का समय समाप्त होता है: टी में अनुरोधों में से किसी एक के लिए इंतजार कर रहे कतार में कब अनुरोध किया जाता है, उस समय की सीमा वह मुक्त होने के लिए पूल। दूसरे शब्दों में, HTTP में हमारे पास अधिकतम आकार वाले कनेक्शन का पूल होता है। जब आवेदन पर लोड होता है तो पूल शायद पूरा हो जाता है और किसी भी नए अनुरोध को पूल से दूसरे अनुरोध के लिए इंतजार करना होगा।
0

यह अनुक्रम चित्र मदद कर सकता है।

sequence diagram for timeouts

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