2013-09-04 25 views
7

Tworzę nowy HttpClient, przekazując ThreadSafeClientConnManager i HttpParams w jego konstruktorze, ale zawsze generuje zły błąd żądania. Aby dowiedzieć się, co poszło nie tak, debugowałem to, ale wszystko na próżno. Podać mi jakieś rozwiązanie Oto mój blok koduUstaw obiekt HttpParams w 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); 

gdy zgłoszę g_client.execute(postMethod); w moim kodu jest ona pokazuje 400 kod stanu oznacza, że ​​coś jest nie tak z moją prośbę. Gdybym przekazać null w moim konstruktora DefaultHttpClient

g_client = new DefaultHttpClient(connmgr, null); 

Klient realizuje z powodzeniem, ale to nie jest właściwa droga jak trzeba ustawić podstawowe param maxconnectionperroute. Miałem tu wkleić wątpliwy kod. Proszę spojrzeć i mi pomóc. Utknąłem tutaj.

Używam wersji HttpClient 4.0.

+1

Czy jest jakiś szczególny powód, dla którego używasz takiego nieaktualnej wersji Apache HttpClient? – oleg

+0

Tylko jeden powód, ponieważ korzystam z serwera WebSphere (nie znam dokładnej wersji), który obsługuje tylko tę wersję httpclient. –

Odpowiedz

1

Utwórz obiekt za pomocą domyślnego (działającego) konstruktora. Następnie zmodyfikuj właściwości obiektu zgodnie z definicją w dokumentacji Apache HttpClient dla używanej wersji. Przykład 4,5:

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

Do zarządzania rzeczy takie jak max połączeń na trasie, przyjrzeć się, że (różnych klas zaangażowanych) dokumentację:

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

4

W jednym z naszych starszych projektach rób prawie dokładnie to, co próbujesz zrobić, chyba że ustawimy domyślne maksymalne połączenia dla trasy bezpośrednio w metodzie (bez potrzeby ustawiania parametrów w taki sposób, w jaki robisz).

Ponadto, uważam, że ConnManagerParams.setTimeout(basicParams, 2000) jest równoważne (i może być zastąpione) g_client.getParams().setParameter(ConnManagerPNames.TIMEOUT, 2000);.

Przykład kodu alternatywa:

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

W ten sposób id również rozwiązuje problem. Prawdopodobnie zawijam menedżera połączeń w usłudze. – AnthonyJClink

Powiązane problemy