Java HTTP Client Request с заданным временем ожидания - PullRequest
82 голосов
/ 08 июня 2010

Я бы хотел использовать BIT (встроенные тесты) для нескольких серверов в моем облаке.Мне нужен запрос для сбоя при большом тайм-ауте.

Как мне сделать это с Java?

Попытка чего-то подобного приведенному ниже не работает.- РЕДАКТИРОВАТЬ: уточнить, какая библиотека используется -

Я использую httpclient из apache, вот соответствующий раздел pom.xml

 <dependency>
   <groupId>org.apache.httpcomponents</groupId>
   <artifactId>httpclient</artifactId>
   <version>4.0.1</version>
   <type>jar</type>
 </dependency>

Ответы [ 9 ]

114 голосов
/ 09 июня 2010
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.BasicHttpParams;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;

...

    // set the connection timeout value to 30 seconds (30000 milliseconds)
    final HttpParams httpParams = new BasicHttpParams();
    HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
    client = new DefaultHttpClient(httpParams);
107 голосов
/ 03 октября 2013

Если вы используете Http Client версии 4.3 и выше, вы должны использовать это:

RequestConfig requestConfig = RequestConfig.custom().setConnectTimeout(30 * 1000).build();
HttpClient httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();
30 голосов
/ 16 июня 2014

HttpParams устарела в новой библиотеке Apache HTTPClient. Использование кода, предоставленного Laz, приводит к предупреждению об устаревании.

Я предлагаю использовать RequestConfig вместо этого в вашем экземпляре HttpGet или HttpPost:

final RequestConfig params = RequestConfig.custom().setConnectTimeout(3000).setSocketTimeout(3000).build();
httpPost.setConfig(params);
10 голосов
/ 08 июня 2010

Похоже, вы используете HttpClient API, о котором я ничего не знаю, но вы могли бы написать нечто похожее на это, используя ядро ​​Java.

try {

   HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
   con.setRequestMethod("HEAD");
   con.setConnectTimeout(5000); //set timeout to 5 seconds
   return (con.getResponseCode() == HttpURLConnection.HTTP_OK);

} catch (java.net.SocketTimeoutException e) {
   return false;
} catch (java.io.IOException e) {
   return false;
}
7 голосов
/ 17 июня 2011

Я обнаружил, что установка параметров тайм-аута в HttpConnectionParams и HttpConnectionManager не решила наш случай. Мы ограничены использованием org.apache.commons.httpclient версии 3.0.1.

В итоге я использовал java.util.concurrent.ExecutorService для мониторинга вызова HttpClient.executeMethod().

Вот маленький, самостоятельный пример

<code>import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.EntityEnclosingMethod;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import java.io.File;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.*;

/**
 * @author Jeff Kirby
 * @since <pre>Jun 17, 2011
* / public class Example { private static final String SITE = "http://some.website.com/upload"; приватная статическая финал int TIME_OUT_SECS = 5; // загрузить файл и вернуть ответ в виде строки Публичная строка (файл файла) выдает IOException, InterruptedException { final Part [] multiPart = {new FilePart ("file", file.getName (), file)}; final EntityEnclosingMethod post = new PostMethod (SITE); post.setRequestEntity (new MultipartRequestEntity (multiPart, post.getParams ())); final ExecutorService executor = Executors.newSingleThreadExecutor (); окончательный список > futures = executor.invokeAll (Arrays.asList (new KillableHttpClient (post)), TIME_OUT_SECS, TimeUnit.SECONDS); executor.shutdown (); if (futures.get (0) .isCancelled ()) { сгенерировать новое IOException (истекло время ожидания SITE +. Для ответа потребовалось более «+ TIME_OUT_SECS +« секунд »); } return post.getResponseBodyAsString (); } закрытый статический класс KillableHttpClient реализует Callable { закрытый финальный пост EntityEnclosingMethod; private KillableHttpClient (EntityEnclosingMethod post) { this.post = пост; } public Integer call () создает исключение { вернуть новый HttpClient (). executeMethod (post); } } }
6 голосов
/ 03 ноября 2014

Указанный метод с наибольшим повышением по Laz устарел с версии 4.3 и выше. Следовательно, было бы лучше использовать объект запроса конфигурации и затем построить клиент HTTP

    private CloseableHttpClient createHttpClient()
        {
        CloseableHttpClient httpClient;
        CommonHelperFunctions helperFunctions = new CommonHelperFunctions();
        PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
        cm.setMaxTotal(306);
        cm.setDefaultMaxPerRoute(108);
        RequestConfig requestConfig = RequestConfig.custom()
            .setConnectTimeout(15000)
            .setSocketTimeout(15000).build();
        httpClient = HttpClients.custom()
            .setConnectionManager(cm)
            .setDefaultRequestConfig(requestConfig).build();
        return httpClient;
        }

PoolingHttpClientConnectionManager - это пользователь, который устанавливает максимальное количество соединений по умолчанию и максимальное количество конфликтов на маршрут. Я установил его как 306 и 108 соответственно. Значения по умолчанию не будут достаточными для большинства случаев.

Для настройки времени ожидания: Я использовал объект RequestConfig. Вы также можете установить свойство Время ожидания запроса на подключение, чтобы задать время ожидания для ожидания подключения из диспетчера подключений.

5 голосов
/ 23 апреля 2013

Это уже упоминалось в комментарии benvoliot выше.Но я думаю, что это стоит пост на высшем уровне, потому что это, конечно, заставило меня почесать голову.Я публикую это на тот случай, если это поможет кому-то другому.

Я написал простой тестовый клиент, и тайм-аут CoreConnectionPNames.CONNECTION_TIMEOUT отлично работает в этом случае.Запрос отменяется, если сервер не отвечает.

Внутри кода сервера, который я на самом деле пытался протестировать, идентичный код никогда не истекает.

Изменение времени ожидания наАктивность соединения с сокетом (CoreConnectionPNames.SO_TIMEOUT), а не соединение HTTP (CoreConnectionPNames.CONNECTION_TIMEOUT) исправила проблему для меня.

Кроме того, внимательно прочитайте документы Apache: http://hc.apache.org/httpcomponents-core-ga/httpcore/apidocs/org/apache/http/params/CoreConnectionPNames.html#CONNECTION_TIMEOUT

Обратите внимание на бит, который говорит

Обратите внимание, что этот параметр может быть применен только к соединениям, которые привязаны к определенному локальному адресу.Я почесал голову.Это научит меня не читать документацию полностью!

2 голосов
/ 10 июля 2014

Оператор позже заявил, что они используют Apache Commons HttpClient 3.0.1

 HttpClient client = new HttpClient();
        client.getHttpConnectionManager().getParams().setConnectionTimeout(5000);
        client.getHttpConnectionManager().getParams().setSoTimeout(5000);
1 голос
/ 25 октября 2012

HttpConnectionParams.setSoTimeout(params, 10*60*1000);// for 10 mins i have set the timeout

Вы также можете определить необходимое время ожидания.

...