2013-09-04 21 views
7

में HttpParams ऑब्जेक्ट सेट करें मैं अपने कन्स्ट्रक्टर में ThreadSafeClientConnManager और HttpParams को पार करके, नया HttpClient बना रहा हूं, लेकिन यह हमेशा खराब अनुरोध त्रुटि फेंकता है। यह पता लगाने के लिए कि क्या गलत हुआ, मैंने इसे डीबग किया था लेकिन सभी व्यर्थ में थे। मुझे कुछ समाधान के साथ प्रदान यहाँ मेरी कोड ब्लॉकएचटीपी क्लाइंट 4.0

sc.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); 
sc.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); 

HttpParams basicParams = new BasicHttpParams(); 
ThreadSafeClientConnManager connmgr = new ThreadSafeClientConnManager(basicParams, sc); 
ConnManagerParams.setMaxConnectionsPerRoute(
    basicParams, 
    // if we have more than 5 concurrent leads, good problem to have 
    new ConnPerRoute() { 
     public int getMaxForRoute(HttpRoute httproute) { 
     return 5; 
    } 
}); 

g_client = new DefaultHttpClient(connmgr, basicParams); 

// It's a lead, be forgiving with timeout 
g_client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); 
g_client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000); 
ConnManagerParams.setTimeout(basicParams, 2000); 

जब मैं अपने कोड यह है में g_client.execute(postMethod); फोन है 400 स्थिति कोड का अर्थ कुछ मेरे अनुरोध के साथ गलत है पता चलता है। अगर मैं अपने DefaultHttpClient निर्माता

g_client = new DefaultHttpClient(connmgr, null); 

ग्राहक को सफलतापूर्वक क्रियान्वित करने में अशक्त गुजरती हैं, लेकिन यह सही तरीके से मैं बुनियादी परम सेट maxconnectionperroute की जरूरत के रूप में नहीं है। मैंने यहां संदिग्ध कोड पेस्ट किया था। कृपया एक नज़र डालें और मेरी मदद करें। मैं यहाँ फंस गया हूँ।

मैं HttpClient 4.0 संस्करण का उपयोग कर रहा हूं।

+1

कोई विशेष कारण है कि आप अपाचे HttpClient के इस तरह के पुराने संस्करण का उपयोग कर रहे हैं? – oleg

+0

सिर्फ एक कारण है क्योंकि मैं वेबस्पेयर सर्वर का उपयोग कर रहा हूं (सटीक संस्करण नहीं जानता) जो केवल इस httpclient संस्करण का समर्थन करता है। –

उत्तर

1

डिफ़ॉल्ट (कार्यरत) कन्स्ट्रक्टर के साथ ऑब्जेक्ट बनाएं। फिर उपयोग किए जा रहे संस्करण के लिए अपाचे HttpClient दस्तावेज़ में परिभाषित ऑब्जेक्ट के गुणों को संशोधित करें। 4.5 के लिए उदाहरण:

http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/impl/client/DefaultHttpClient.html

मार्ग प्रति अधिकतम कनेक्शन जैसी चीजों के प्रबंधन के लिए, (शामिल विभिन्न वर्गों) प्रलेखन कि पर एक नज़र डालें:

http://hc.apache.org/httpcomponents-client-ga/tutorial/html/connmgmt.html

4

हमारे पुराने परियोजनाओं में से एक में हम लगभग वही करें जो आप करने की कोशिश कर रहे हैं सिवाय इसके कि हम सीधे setDefaultMaxPerRoute(int) विधि पर ThreadSafeClientConnManager (सीधे आपके द्वारा किए गए पैराम सेट करने की आवश्यकता के बिना) पर प्रति मार्ग डिफ़ॉल्ट अधिकतम कनेक्शन सेट करते हैं।

इसके अलावा, मुझे विश्वास है कि ConnManagerParams.setTimeout(basicParams, 2000)g_client.getParams().setParameter(ConnManagerPNames.TIMEOUT, 2000); के बराबर है (और इसके साथ प्रतिस्थापित किया जा सकता है)।

उदाहरण विकल्प कोड:

SchemeRegistry sc = new SchemeRegistry(); 
sc.register(new Scheme("http", 80, PlainSocketFactory.getSocketFactory())); 
sc.register(new Scheme("https", 443, SSLSocketFactory.getSocketFactory())); 

ThreadSafeClientConnManager connmgr = new ThreadSafeClientConnManager(sc); 
connmgr.setDefaultMaxPerRoute(5); /// Alternative approach to yours /// 

DefaultHttpClient g_client = new DefaultHttpClient(connmgr); 
g_client.getParams().setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 5000); 
g_client.getParams().setParameter(CoreConnectionPNames.SO_TIMEOUT, 5000); 
g_client.getParams().setParameter(ConnManagerPNames.TIMEOUT, 2000); /// Alternative approach to yours /// 
+0

इस प्रकार आईडी समस्या को हल करती है। आईडी शायद एक सेवा में कनेक्शन प्रबंधक लपेटें हालांकि। – AnthonyJClink

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