2011-10-15 18 views
11

Desidero eseguire richieste HTTP asincrone thread-safe utilizzando HTTPClient. Ho notato che non rispetta il mio argomento CONNECTION_TIMEOUT.Come impostare un timeout della connessione nel client http Apache?

Il codice è ibrido ColdFusion/Java.

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

Indipendentemente da ciò che fornisco per connection_timeout, le richieste di ritorno sempre 200 OK. Controlla l'output qui sotto.

  1. Come impostare un timeout della connessione efficace?
  2. CONNECTION_TIMEOUT fa qualcosa?

uscita

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

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

[snip] 

5 requests using Async Client in: 2308 ms 

risposta

3

La documentazione per Apache di HttpClient è una specie di spotty. Prova questo nel tuo setup (ha funzionato per me con la versione 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

Grazie. Sto provando il tuo codice, ma ci vuole del lavoro extra per tradurlo in CF. Così nudo con me. Nei primi due linse 'HTTPConnectionParams' fa riferimento a un oggetto che ho bisogno di creare. Porbably 'org.apache.http.params. *' Ma da dove proviene l'argomento 'params' che fornite a' setConnectionTimeout'? Non riesco a lanciarlo, altrimenti manderei un errore 'params is undefined' ... scusa se questo sembra ottuso, ma lavorare con il codice ibrido java/CF è noioso. Inoltre, l'oggetto SchemeRegistry è necessario, posso semplicemente lasciarlo fuori? – Mohamad

+0

Parametri HttpParams = new BasicHttpParams(); Ci sono altre informazioni qui: http://hc.apache.org/httpcomponents-client-ga/tutorial/html/index.html e il javadoc è qui: http://hc.apache.org/httpcomponents-core-ga /httpcore/apidocs/org/apache/http/params/HttpParams.html – Seth

2

Devi definire un oggetto HttpParams usando i metodi di classe del framework.

 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); 
Problemi correlati