2012-08-09 11 views
24

मैं निम्नलिखित कोड के साथ अपने सर्वर से अनुरोध भेजने की कोशिश कर रहा हूं। यह हमेशा तीसरे अनुरोध पर असफल रहा।httpclient अपवाद "org.apache.http.conn.ConnectionPoolTimeoutException: कनेक्शन के लिए टाइमआउट प्रतीक्षा"

import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.nio.charset.Charset; 

import org.apache.http.HttpEntity; 
import org.apache.http.HttpResponse; 
import org.apache.http.HttpStatus; 
import org.apache.http.HttpVersion; 
import org.apache.http.client.HttpClient; 
import org.apache.http.client.methods.HttpPost; 
import org.apache.http.entity.ContentType; 
import org.apache.http.entity.StringEntity; 
import org.apache.http.impl.client.DefaultHttpClient; 
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager; 
import org.apache.http.params.BasicHttpParams; 
import org.apache.http.params.CoreConnectionPNames; 
import org.apache.http.params.HttpParams; 
import org.apache.http.params.HttpProtocolParams; 
import org.json.JSONException; 
import org.json.JSONObject; 
import org.json.JSONTokener; 

public class HttpClientTest { 
    private HttpClient client; 

    public HttpClientTest() { 
     HttpParams params = new BasicHttpParams(); 
     params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 15000); 
     params.setParameter(CoreConnectionPNames.SO_TIMEOUT, 15000); 

     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, "utf-8"); 
     HttpProtocolParams.setUseExpectContinue(params, true); 
     ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(); 
     cm.setMaxTotal(100); 
     client = new DefaultHttpClient(cm, params); 

     while (true) { 
      HttpPost mPost = new HttpPost("http://myip/myservice"); 

      JSONObject json = new JSONObject(); 
      try { 
       json.put("serialNumber", "abcd"); 
      } catch (JSONException e1) { 
       e1.printStackTrace(); 
      } 
      StringEntity s = null; 
      try { 
       s = new StringEntity(json.toString()); 
      } catch (UnsupportedEncodingException e) { 
       e.printStackTrace(); 
      }    
      s.setContentEncoding("UTF-8"); 
      s.setContentType("application/json"); 
      mPost.setEntity(s); 

      JSONObject response = null; 

      System.out.println("HttpClientTest ---> send post"); 
      HttpResponse mHttpResponse; 
      try { 
       mHttpResponse = client.execute(mPost); 
       System.out.println("HttpClientTest ---> get response"); 
       if(mHttpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ 
        HttpEntity entity = mHttpResponse.getEntity(); 
        ContentType contentType = ContentType.getOrDefault(entity); 
        Charset charset = contentType.getCharset(); 
        response = new JSONObject(new JSONTokener(new InputStreamReader(entity.getContent(), charset))); 

        System.out.println("HttpClientTest ---> get result:" + response.toString()); 
       } else { 
        mPost.abort(); 
        break; 
       } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
     } 
    } 

    public static void main(String[] args) { 
     HttpClientTest t = new HttpClientTest(); 
    } 
} 

अपवाद निम्नलिखित के रूप में:

org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection 
    at org.apache.http.impl.conn.tsccm.ConnPoolByRoute.getEntryBlocking(ConnPoolByRoute.java:417) 
    at org.apache.http.impl.conn.tsccm.ConnPoolByRoute$1.getPoolEntry(ConnPoolByRoute.java:300) 
    at org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager$1.getConnection(ThreadSafeClientConnManager.java:224) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:401) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732) 
    at com.i360r.client.takeaway.network.HttpClientTest.<init>(HttpClientTest.java:68) 
    at com.i360r.client.takeaway.network.HttpClientTest.main(HttpClientTest.java:88) 
+1

क्या आप इसके लिए कोई समाधान प्राप्त कर सकते हैं? – CoronaPintu

+0

कोई इसे हल किया है? प्रतिक्रिया को अनदेखा करते समय –

उत्तर

22

मैं इसे तय कर दी है! finally ब्लॉक में जोड़ें।

try { 
} catch (Exception e) { 
} finally { 
    mPost.releaseConnection(); 
} 

अद्यतन पैकेज DO org.apache.httpcomponents 4.2.1

39

को मैं एक ही समस्या थी और मैं ठीक पाया। यह टाइमआउट कनेक्शन रिसाव के कारण है। मेरे मामले में मैं httpDelete विधि का उपयोग कर रहा हूं और प्रतिक्रिया का उपभोग नहीं कर रहा हूं। इसके बजाय, प्रतिक्रिया की स्थिति की जांच।

फिक्स है, प्रतिक्रिया इकाई को खपत की जरूरत है। सिस्टम संसाधनों की उचित रिलीज सुनिश्चित करने के लिए किसी को इकाई से जुड़े सामग्री स्ट्रीम को बंद करना होगा।

इसलिए मैंने EntityUtils.consumeQuietly(response.getEntity()); का उपयोग किया जो सुनिश्चित करता है कि इकाई सामग्री पूरी तरह से उपभोग की जाती है और सामग्री स्ट्रीम, यदि मौजूद है, बंद है।

+1

फ्लुएंट HTTP क्लाइंट के साथ एक समान समस्या थी। अभी भी कनेक्शन लीक से बचने के लिए execute()। DiscardContent() को कॉल करना होगा। – rrhartjr

+4

तो बहुत परेशान .... पुस्तकालय को त्यागना चाहिए यदि आप इसका उपभोग नहीं करते हैं ... या कम से कम आपको इसके बारे में चेतावनी देते हैं ... – nterry

2

यह भी अगर आप DropWizard 0.6.2, जो पर्दे के पीछे एक डिफ़ॉल्ट विन्यास के साथ एक MultiThreadedHttpConnectionManager बनाता है साथ ApacheHttpClient उपयोग कर रहे हैं हो सकता है - और कि डिफ़ॉल्ट कॉन्फ़िगरेशन केवल एक समय more info here पर 2 समवर्ती http कनेक्शन की अनुमति दी।

तो इस कॉन्फ़िगरेशन के साथ, यदि आपका सर्वर दलदल हो रहा है और उसी मेजबान के लिए अनुरोध कर रहा है, तो आपके पास अधिकतम 2 कनेक्शन एक समय में चलने की अनुमति होगी!