2012-08-09 8 views
24

Aşağıdaki kodu kullanarak sunucuma istek göndermeye çalışıyorum. her zaman 3. istekte başarısız oldu. Aşağıdaki şekildehttpclient exception "org.apache.http.conn.ConnectionPoolTimeoutException: Zaman aşımı bağlantı için bekliyor"

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

istisna:

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

Bunun için herhangi bir çözüm bulabilir misiniz? – CoronaPintu

+0

birisi çözdü mü? –

cevap

22

bunu sabit! finally bloklarına mPost.releaseConnection() ekleyin.

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

Ben aynı sorunu vardı ve düzeltme bulundu org.apache.httpcomponents

39

4.2.1 güncelleme paketini DO. Bu zaman aşımı, bir bağlantı sızıntısından kaynaklanıyor. Benim durumumda, httpDelete yöntemini kullanıyorum ve yanıtı tüketmiyorum. Bunun yerine, yanıtın durumunu kontrol etmek.

Düzeltme, yanıt varlıklarının tüketilmesi gerektiğidir. Sistem kaynaklarının düzgün bir şekilde serbest bırakılmasını sağlamak için, varlık ile ilişkili içerik akışını kapatmak gerekir.

EntityUtils.consumeQuietly(response.getEntity()); kullandım, bu da varlık içeriğinin tamamen tüketilmesini ve varsa içerik akışının kapalı olmasını sağlar.

+1

Yanıtı göz ardı ederken, Fluent HTTP Client ile benzer bir sorun vardı. Hala bağlantı sızıntılarını önlemek için execute(). DiscardContent() öğesini çağırmak zorundasınız. – rrhartjr

+4

Çok sinir bozucu .... Eğer onu tüketmiyorsanız kütüphane atılmalıdır ... Ya da en azından hakkında bir uyarı ver ... – nterry

2

sahne arkasında bir varsayılan yapılandırmaya sahip bir MultiThreadedHttpConnectionManager yaratır DropWizard 0.6.2 ile ApacheHttpClient kullanıyorsanız bu de olabilir - ve sadece bir defada more info here 2 eşzamanlı http bağlantıları izin verdiğini varsayılan yapılandırmada.

Bu yapılandırmayla, sunucunuz bataklık alıyorsa ve aynı ana makineye istekte bulunuluyorsa, aynı anda maksimum 2 bağlantıya izin verilir!