2013-09-04 9 views
7

Sto creando un nuovo HttpClient, passando ThreadSafeClientConnManager e HttpParams nel suo costruttore, ma viene sempre generato un errore di richiesta errato. Per capire cosa è andato storto, l'ho eseguito nel debug ma invano. fornirmi qualche soluzione Qui è il mio blocco di codiceImposta oggetto HttpParams in 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); 

quando chiamo g_client.execute(postMethod); nel mio codice è mostra 400 codice di stato significa che qualcosa non va con la mia richiesta. Se mi passa nulla nel mio DefaultHttpClient costruttore

g_client = new DefaultHttpClient(connmgr, null); 

Il client è in esecuzione con successo, ma non è modo giusto, come ho bisogno di param base impostato maxconnectionperroute. Ho incollato qui il codice dubbio. Per favore date un'occhiata e aiutatemi. Sono bloccato qui.

Sto usando la versione HttpClient 4.0.

+1

C'è un motivo particolare che si sta utilizzando una versione obsoleta di tale Apache HttpClient? – oleg

+0

Una sola ragione perché sto utilizzando il server WebSphere (non conosco la versione esatta) che supporta solo questa versione di httpclient. –

risposta

1

Creare l'oggetto con il costruttore predefinito (di lavoro). Quindi modificare le proprietà dell'oggetto come definito nella documentazione di HttpClient di Apache per la versione utilizzata. Esempio per 4.5:

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

Per la gestione di cose come le connessioni max per rotta, dare un'occhiata a che (diverse classi coinvolte) di documentazione:

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

4

In uno dei nostri progetti più anziani abbiamo fare quasi esattamente ciò che si sta tentando di fare, tranne che impostiamo le connessioni massime predefinite per ogni instradamento direttamente sul metodo setDefaultMaxPerRoute(int) in (senza la necessità di impostare i parametri nel modo in cui lo si fa).

Inoltre, credo che ConnManagerParams.setTimeout(basicParams, 2000) sia equivalente a (e possa essere sostituito con) g_client.getParams().setParameter(ConnManagerPNames.TIMEOUT, 2000);.

Esempio codice alternativo:

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

Questo è il modo in cui id risolve il problema. L'id probabilmente avvolge comunque il gestore delle connessioni in un servizio. – AnthonyJClink

Problemi correlati