2011-12-29 11 views
6

Jestem obecnie za pomocą HTTPClient 4 do żądania POST do zdalnego serwera jak ten:Zamknięcie HttpClient połączenie przed Timout osiągnięciu

HttpResponse response = httpClient.execute(request); 
    InputStream is = response.getEntity().getContent(); 

Gdy serwer nie jest osiągalny potrzebny samoskonfigurowanego ilość czas zanim połączenie faktycznie przekroczy limit czasu. Podczas tego periode execute() jest wywołaniem blokującym.

To, czego szukam, to sposób na anulowanie execute() przed naturalnym limitem czasu, aby mój wątek uruchamiający execute() nie był już zablokowany i zakończy się z wdziękiem.

Próbowałem

request.abort(); 

i

httpClient.getConnectionManager().shutdown(); 

Ale oba te rozmowy nie przerywają execute(). Czy istnieje inny sposób anulowania trwającej próby połączenia?

Odpowiedz

0

Zawiń połączenie w Future i wywołaj get with timeout.

+0

szukam sposobu, aby zatrzymać blokowanie execute(), aby nie czekać dłużej. – Moritz

+0

Przyszłość impl będzie "blokować", ale wątek wywołujący może czekać na ~ dokładną miarę mseków, a następnie "timeout" i kontynuować swoją wesołą drogę. – alphazero

+0

Nie chcę czekać dokładnego czasu, chcę zatrzymać execute() od blokowania bieżącego wątku. – Moritz

0

myślę, że można ustawić ConnectionTimeout niezależnie od czasu, który ma być max przy użyciu następujących metod: setConnectionTimeout()

setSoTimeout() 
+0

Ustawiłem limit czasu połączenia przed. Problem, przed którym stoję, polega na tym, że chcę ręcznie przerwać wykonanie execute() przed upływem limitu czasu. – Moritz

+0

Czy zamknąłeś InputStream? Innym pytaniem jest "prośba" w pytaniu, czy to oznacza HttpGet/HttpPost? – kosa

+0

Nie otrzymałem żadnego strumienia wejściowego, ponieważ funkcja .execute() jest blokowana, dopóki nie nastąpi czas gniazda gniazda, w którym to przypadku generowany jest wyjątek SocketException. Co chcę osiągnąć, to zatrzymać wykonywanie (i blokowanie wątku) PRZED uruchomieniem limitu czasu gniazda. Żądanie to żądanie POST. – Moritz