दिलचस्प पोस्ट
स्लाइडर के तहत jQuery के यूआई स्लाइडर लेबल सी स्ट्रिंग स्थिरांक को संशोधित करना? एंड्रॉइड एप्लीकेशन में "बंडल" क्या है SWFobject का उपयोग करके, HTML कंटेनर को सूचित करने के लिए कि SWF समाप्त हो गया है आपको स्क्रिप्ट फ़ाइल की शुरुआत में #! / बिन / बाश क्यों डालनी है? Mercurial और Git के बीच अंतर क्या है? नए तत्वों को जोड़ने के लिए क्या उप-वर्गीकृत किया जा सकता है? कैसे jQuery का उपयोग कर लिंक पर एक क्लिक ट्रिगर करने के लिए ऑक्सीजन की शुरुआत क्यों नहीं की जाएगी (पहली बार)? सत्र का जीवनकाल कैसे सेट करें स्विफ्ट सरणी पर ऑपरेशन (यूनियन, प्रतिच्छेदन) सेट करें? कैसे जाँचने के लिए कि कर्ल सक्षम या अक्षम है जीसीसी के साथ सी प्रोग्राम के प्रवेश बिंदु को कैसे बदल सकता है? अजगर इंडेंटेशन को ठीक कैसे करें इंटरफेस में कोई स्थिर तरीके क्यों नहीं, लेकिन स्थैतिक फ़ील्ड और आंतरिक वर्ग ठीक है?

एचटीटीपी क्लाइंट 4.0.1 – कनेक्शन कैसे रिलीज करना है?

मेरे यूआरएल के एक समूह पर एक पाश है, प्रत्येक के लिए मैं निम्नलिखित कर रहा हूं:

private String doQuery(String url) { HttpGet httpGet = new HttpGet(url); setDefaultHeaders(httpGet); // static method HttpResponse response = httpClient.execute(httpGet); // httpClient instantiated in constructor int rc = response.getStatusLine().getStatusCode(); if (rc != 200) { // some stuff... return; } HttpEntity entity = response.getEntity(); if (entity == null) { // some stuff... return; } // process the entity, get input stream etc } 

पहली क्वेरी ठीक है, दूसरा इस अपवाद को फेंकता है:

थ्रेड "मुख्य" में अपवाद "java.lang.IllegalStateException: SingleClientConnManager का अमान्य उपयोग: कनेक्शन अभी भी आवंटित दूसरे को आवंटित करने से पहले कनेक्शन को रिलीज करना सुनिश्चित करें org.apache.http.impl.con..SingleClientConnManager.getConnection पर (SingleClientConnManager.java.199) org.apache.http.impl.con.ing.SingleClientConnanager पर $ 1.getConnection (SingleClientConnManager.java:173) …… पर

यह सिर्फ एक साधारण एकल-थ्रेडेड ऐप है। मैं यह कनेक्शन कैसे छोड़ सकता हूं?

वेब के समाधान से एकत्रित समाधान "एचटीटीपी क्लाइंट 4.0.1 – कनेक्शन कैसे रिलीज करना है?"

अनुशंसित तरीके, एचटीटीपी कंपोनेंट्स 4.1 द्वारा, कनेक्शन बंद करना और किसी भी अंतर्निहित संसाधन को रिलीज करना है:

 EntityUtils.consume(HttpEntity) 

जहां HttpEntity पारित एक प्रतिक्रिया इकाई है।

यह बहुत अच्छा काम करता है:

  if( response.getEntity() != null ) { response.getEntity().consumeContent(); }//if 

और इकाई का उपभोग करने के लिए मत भूलो, भले ही आपने इसकी सामग्री नहीं खोली। उदाहरण के लिए, आप प्रतिक्रिया से एक HTTP_OK स्थिति की अपेक्षा करते हैं और इसे प्राप्त नहीं करते हैं, आपको अभी भी इकाई का उपभोग करना है!

अपने प्रश्न का उत्तर देने के लिए: कनेक्शन को रिलीज करने के लिए (और अनुरोध से जुड़े किसी भी अन्य संसाधन) आपको HttpEntity द्वारा वापस आने वाले इनपुटस्ट्रीम को बंद करना होगा:

 InputStream is = entity.getContent(); .... process the input stream .... is.close(); // releases all resources 

डॉक्स से

संस्करण 4.2 के बाद से, उन्होंने एक बहुत अधिक सुविधा पद्धति पेश की जो कि कनेक्शन रिलीज़ को सरल करती है: एचटीटीपीएंडईबेस। रीलीज कनेक्शन ()

मैं एक विस्तृत जवाब के साथ चिंरकर रहा हूँ जो विशेष रूप से अपाचे एचटीटीपी क्लाइंट 4.0.1 को संबोधित करता है। मैं इस एचटीटीपी क्लाइंट संस्करण का उपयोग कर रहा हूं, क्योंकि यह वीएएस v8.0 द्वारा प्रदान किया गया है, और मुझे एपache विंक v1.1.1 के भीतर प्रदान की गई एचटीटीपी क्लायंट का उपयोग करना होगा, जो कि वीएएस v8.0 द्वारा प्रदान किया गया था, जो कि शेयरपॉइंट के लिए कुछ एनटीएलएम प्रमाणित आराम कॉल करता है ।

अपाचे एचटीटीपी क्लायंट मेलिंग लिस्ट में ओलेग कलनिशेव्स्की को उद्धृत करने के लिए:

बहुत ज्यादा यह सब कोड आवश्यक नहीं है। (1) एचटीटीपी क्लाइंट स्वचालित रूप से अंतर्निहित कनेक्शन को तब तक रिलीज करेगा जब तक इकाई की सामग्री धारा के अंत तक भस्म हो जाती है; (2) प्रतिक्रिया सामग्री पढ़ते समय एचटीटीपी क्लाइंट स्वचालित रूप से किसी भी आई / ओ अपवाद पर स्वतः अंतर्निहित कनेक्शन जारी कर देगा। ऐसे मामले में कोई विशेष प्रसंस्करण आवश्यक नहीं है।

वास्तव में, संसाधनों की उचित रिलीज सुनिश्चित करने के लिए यह पूरी तरह से पर्याप्त है:

 HttpResponse rsp = httpclient.execute(target, req); HttpEntity entity = rsp.getEntity(); if (entity != null) { InputStream instream = entity.getContent(); try { // process content } finally { instream.close(); // entity.consumeContent() would also do } } 

बस इतना ही।

स्रोत

यदि प्रतिक्रिया का उपयोग नहीं किया जाता है, तो अनुरोध नीचे दिए गए कोड का उपयोग करके निरस्त किया जा सकता है:

 // Low level resources should be released before initiating a new request HttpEntity entity = response.getEntity(); if (entity != null) { // Do not need the rest httpPost.abort(); } 

संदर्भ: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/fundamentals.html#d5e143

अपाचे एचटीटीपी क्लाइंट संस्करणः 4.1.3

जब मैं Multithread envirnoment (Servlets) में एचटीटीपी क्लाइंट का उपयोग करता हूं तो मुझे यह समस्या मिलती है I एक सर्विसलेट अभी भी कनेक्शन रखता है और दूसरा एक कनेक्शन प्राप्त करना चाहता है।

उपाय:

संस्करण 4.0 का प्रयोग करें ThreadSafeClientConnManager

संस्करण 4.2 PoolingClientConnectionManager उपयोग PoolingClientConnectionManager

और ये दो सेटर्स सेट करें:

 setDefaultMaxPerRoute setMaxTotal 

HTTP हेड अनुरोध थोड़ा अलग तरीके से व्यवहार किया जाना चाहिए क्योंकि response.getEntity () शून्य है। इसके बजाय, आपको HttpContext को HttpClient.execute () में पारित किया जाना चाहिए और उसे बंद करने के लिए कनेक्शन पैरामीटर पुनः प्राप्त करना होगा (एचटीटीपीएम्पनेंट्स 4.1.X में भी)।

 HttpRequest httpRqst = new HttpHead( uri ); HttpContext httpContext = httpFactory.createContext(); HttpResponse httpResp = httpClient.execute( httpRqst, httpContext ); ... // Close when finished HttpEntity entity = httpResp.getEntity(); if( null != entity ) // Handles standard 'GET' case EntityUtils.consume( entity ); else { ConnectionReleaseTrigger conn = (ConnectionReleaseTrigger) httpContext.getAttribute( ExecutionContext.HTTP_CONNECTION ); // Handles 'HEAD' where entity is not returned if( null != conn ) conn.releaseConnection(); } 

HttpComponents 4.2.X ने एक आसान रिलीज कॉननेक्शन () को HttpRequestBase को आसान बनाने के लिए जोड़ा।

मेरे पास एक ही समस्या थी और विधि के अंत में प्रतिक्रिया को बंद करके इसे हल किया था:

 try { // make the request and get the entity } catch(final Exception e) { // handle the exception } finally { if(response != null) { response.close(); } } 

मैं HttpClient 4.5.3 का उपयोग कर रहा हूं, CloseableHttpClient#close का उपयोग करके मेरे लिए काम किया है

  CloseableHttpResponse response = client.execute(request); try { HttpEntity entity = response.getEntity(); String body = EntityUtils.toString(entity); checkResult(body); EntityUtils.consume(entity); } finally { response.close(); } 

यदि आप कनेक्शन का पुन: उपयोग करना चाहते हैं तो आपको प्रत्येक उपयोग के बाद पूरी तरह से सामग्री स्ट्रीम का उपभोग करना होगा:

 EntityUtils.consume(response.getEntity()) 

नोट: यदि आपको स्थिति कोड 200 नहीं है तो भी आपको सामग्री स्ट्रीम का उपभोग करने की आवश्यकता है। ऐसा नहीं करने से अगले उपयोग पर निम्नलिखित को बढ़ाया जाएगा:

थ्रेड "मुख्य" में अपवाद "java.lang.IllegalStateException: SingleClientConnManager का अमान्य उपयोग: कनेक्शन अभी भी आवंटित दूसरे को आवंटित करने से पहले कनेक्शन को रिलीज करना सुनिश्चित करें

यदि यह एक समय का उपयोग होता है, तो कनेक्शन को बंद करने से उसके साथ जुड़े सभी संसाधनों को छोड़ दिया जाएगा।