Подтвердить что ты не робот

Java: apache HttpClient> как отключить повторную попытку

Я использую Apache Httpclient для Ajax-вызовов на веб-сайте. В некоторых случаях запросы на внешний вебсервис терпят неудачу, часто с:

Исключение I/O (java.net.ConnectException), обнаруженное при обработке запроса: время ожидания подключения: connect.

В этом случае, чаще всего, я хочу пропустить повтор запроса (что-то, что Httpclient, кажется, делает автоматически).

Однако я не могу найти какой-либо метод, param и т.д., чтобы пропустить повторную попытку.

кто-нибудь?

Спасибо Geert-Jan

4b9b3361

Ответ 1

client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(0, false));

Это сделало бы это.

Ответ 2

Из httpclient 4.3 используйте HttpClientBuilder

HttpClientBuilder.create().disableAutomaticRetries().build();

Ответ 3

Описание в Учебник HttpClient.

 client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
           new DefaultHttpMethodRetryHandler());

Дополнительную информацию см. в tutorial, например, это может быть вредным, если запрос имеет побочные эффекты (то есть не является идемпотентным).

Ответ 4

OK. В документации есть проблема. Также были внесены изменения в API и методы. Поэтому, если вы хотите использовать DefaultHttpRequestRetryHandler, вот как это сделать,

DefaultHttpClient httpClient = new DefaultHttpClient();
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false);
httpClient.setHttpRequestRetryHandler(retryHandler);

или

HttpClient httpClient = new DefaultHttpClient();
DefaultHttpRequestRetryHandler retryHandler = new DefaultHttpRequestRetryHandler(0, false);
((AbstractHttpClient)httpClient).setHttpRequestRetryHandler(retryHandler);

В первом мы используем конкретный DefaultHttpClient (который является подклассом AbstractHttpClient и поэтому имеет метод setHttpRequestRetryHandler().)

Во втором мы программируем интерфейс HttpClient (который, к сожалению, не раскрывает этот метод, и это странно!! ehh), поэтому нам нужно сделать этот неприятный листинг.

Ответ 5

Приведение в AbstractHttpClient не требуется. Другой способ - использовать стратегию с AutoRetryHttpClient с DefaultServiceUnavailableRetryStrategy для параметра retry задано значение 0. Лучше всего было бы расширить AbstractHttpClient или реализовать HttpClient, чтобы открыть желаемый метод.