2011-10-15 45 views
11

Tôi muốn chạy chuỗi an toàn, yêu cầu HTTP không đồng bộ bằng cách sử dụng HTTPClient. Tôi nhận thấy rằng nó không tôn trọng đối số CONNECTION_TIMEOUT của tôi.Làm cách nào để đặt thời gian chờ kết nối trong ứng dụng khách http Apache?

Mã này là ColdFusion/Java hybrid.

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

Bất kể những gì tôi cung cấp cho CONNECTION_TIMEOUT, yêu cầu luôn trả về 200 OK. Kiểm tra đầu ra bên dưới.

  1. Làm cách nào để đặt thời gian chờ kết nối hiệu quả?
  2. CONNECTION_TIMEOUT có làm gì không?

Output

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

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

[snip] 

5 requests using Async Client in: 2308 ms 

Trả lời

3

Các tài liệu cho của apache HttpClient là loại xe thể thao. Hãy thử điều này trong thiết lập của bạn (nó làm việc cho tôi với phiên bản 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

Cảm ơn. Tôi đang thử mã của bạn, nhưng phải mất thêm công sức để dịch nó sang CF. Vì vậy, trần với tôi. Trong hai dòng đầu tiên 'HTTPConnectionParams' đề cập đến một đối tượng mà tôi cần tạo. Porbably 'org.apache.http.params. *' Nhưng đối số 'params' bạn cung cấp cho' setConnectionTimeout' đến từ đâu? Tôi không thể ném nó trong đó, nếu không nó sẽ ném một 'params là undefined' lỗi ... xin lỗi nếu điều này nghe có vẻ ngớ ngẩn, nhưng làm việc với java/CF lai mã là tẻ nhạt. Ngoài ra, là đối tượng SchemeRegistry cần thiết, tôi có thể bỏ nó ra không? – Mohamad

+0

HttpParams params = new BasicHttpParams(); Có một số thông tin khác ở đây: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html và javadoc có tại đây: http://hc.apache.org/httpcomponents-core-ga /httpcore/apidocs/org/apache/http/params/HttpParams.html – Seth

2

Bạn phải xác định đối tượng HttpParams bằng cách sử dụng các phương thức lớp của khuôn khổ.

 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); 
Các vấn đề liên quan