2012-08-09 13 views
24

Sto tentando di inviare una richiesta al mio server, con il seguente codice. non è riuscito alla terza richiesta, sempre.eccezione httpclient "org.apache.http.conn.ConnectionPoolTimeoutException: Timeout in attesa di connessione"

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

eccezione come segue:

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

puoi trovare qualche soluzione per questo? – CoronaPintu

+0

qualcuno ha risolto? –

risposta

22

ho risolto! aggiungi mPost.releaseConnection() in blocchi finally.

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

DO pacchetto di aggiornamento alla 4.2.1 org.apache.httpcomponents

39

Ho avuto lo stesso problema e ho trovato la correzione. Questo timeout è a causa di una perdita di connessione. Nel mio caso sto usando il metodo httpDelete e non sto consumando la risposta. Invece, controllando lo stato della risposta.

La correzione è, l'entità di risposta deve essere consumata. Per garantire il corretto rilascio delle risorse di sistema, è necessario chiudere il flusso di contenuti associato all'entità.

Quindi ho usato EntityUtils.consumeQuietly(response.getEntity()); che assicura che il contenuto dell'entità sia completamente consumato e che il flusso di contenuti, se esistente, sia chiuso.

+1

Si è verificato un problema simile con Fluent HTTP Client, quando si ignorava la risposta. Devo ancora chiamare execute(). DiscardContent() per evitare perdite di connessione. – rrhartjr

+4

Quindi MOLTO fastidioso .... La biblioteca dovrebbe scartare se non la consumi ... O almeno darti un avvertimento a riguardo ... – nterry

2

Questo può succedere anche se si sta usando ApacheHttpClient con DropWizard 0.6.2, che dietro le quinte crea un MultiThreadedHttpConnectionManager con una configurazione di default - e che la configurazione di default ammessi solo 2 connessioni HTTP simultanee in un momento more info here.

Quindi, con questa configurazione, se il server è sempre inondato e rendendo le richieste allo stesso host per tutto il tempo, avrete max 2 connessioni consentite in esecuzione in un momento!

Problemi correlati