2011-10-15 17 views
11

मैं HTTPClient का उपयोग कर थ्रेड सुरक्षित, एसिंक्रोनस HTTP अनुरोधों को चलाने के लिए चाहता हूं। मैंने देखा कि यह मेरे CONNECTION_TIMEOUT तर्क का सम्मान नहीं करता है।मैं अपाचे http क्लाइंट में कनेक्शन टाइमआउट कैसे सेट करूं?

कोड कोल्डफ्यूजन/जावा हाइब्रिड है।

client = loader.create("org.apache.http.impl.nio.client.DefaultHttpAsyncClient").init(); 
CoreConnectionPNames = loader.create("org.apache.http.params.CoreConnectionPNames"); 

client.getParams() 
    .setIntParameter(JavaCast("string", CoreConnectionPNames.SO_TIMEOUT), 10) 
    .setIntParameter(JavaCast("string", CoreConnectionPNames.CONNECTION_TIMEOUT), 10); 

client.start(); 

request = loader.create("org.apache.http.client.methods.HttpGet").init("http://www.google.com"); 
future = client.execute(request, javacast("null", "")); 

try { 
   response = future.get(); 
} 
catch(e any) {} 

client.getConnectionManager().shutdown(); 

मैं CONNECTION_TIMEOUT के लिए क्या की आपूर्ति के बावजूद, अनुरोध हमेशा 200 ठीक लौट आते हैं। नीचे आउटपुट की जांच करें।

  1. मैं एक प्रभावी कनेक्शन टाइमआउट कैसे सेट करूं?
  2. क्या CONNECTION_TIMEOUT कुछ भी करता है?

आउटपुट

200 OK http://www.google.com/ 

200 OK http://www.google.com/ 

[snip] 

5 requests using Async Client in: 2308 ms 

उत्तर

3

प्रलेखन अपाचे के HttpClient के लिए एक तरह से असमान है। (यह संस्करण 4 के साथ मेरे लिए काम किया) अपने सेटअप में इस प्रयास करें:

HttpConnectionParams.setConnectionTimeout(params, 10000); 
HttpConnectionParams.setSoTimeout(params, 10000); 

... set more parameters here if you want to ... 

SchemeRegistry schemeRegistry = new SchemeRegistry(); 

.. do whatever you ant with the scheme registry here ... 

ThreadSafeClientConnManager connectionManager = new ThreadSafeClientConnManager(params, schemeRegistry); 

client = new DefaultHttpClient(connectionManager, params); 
+0

धन्यवाद। मैं आपका कोड आज़मा रहा हूं, लेकिन इसे सीएफ में अनुवाद करने के लिए अतिरिक्त काम लगता है। तो मेरे साथ बेकार है। पहले दो लिंक्स में 'HTTPConnectionParams' उस ऑब्जेक्ट को संदर्भित करता है जिसे मुझे बनाने की आवश्यकता है। Porbably 'org.apache.http.params। *' लेकिन 'सेटकनेक्शनटाइमआउट' पर आपके द्वारा प्रदान किए गए 'पैराम्स' तर्क कहां से आते हैं? मैं इसे वहां फेंक नहीं सकता, अन्यथा यह 'पैराम्स को अनिर्धारित' त्रुटि फेंक देगा ... क्षमा करें अगर यह लगता है, लेकिन जावा/सीएफ हाइब्रिड कोड के साथ काम करना कठिन है। साथ ही, योजना रजिस्ट्री ऑब्जेक्ट आवश्यक है, क्या मैं इसे छोड़ सकता हूं? – Mohamad

+0

एचटीपी पैराम्स पैराम्स = नया बेसिकहटपैरम्स(); यहां कुछ और जानकारी है: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html और जावाडोक यहां है: http://hc.apache.org/httpcomponents-core-ga /httpcore/apidocs/org/apache/http/params/HttpParams.html – Seth

2

आप एक HttpParams ढांचे की क्लास तरीकों का उपयोग कर वस्तु को परिभाषित करने के लिए है।

 HttpParams params = new BasicHttpParams(); 
     HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1); 
     HttpProtocolParams.setContentCharset(params, HTTP.UTF_8); 
     HttpConnectionParams.setConnectionTimeout(params, 2000); 

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

     ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry); 

     HttpClient client = DefaultHttpClient(ccm, params); 
संबंधित मुद्दे