Код: Выделить всё
public class HttpClientTimeoutExamplePoolingHttpClientConnectionManagerBuilder {
public static void main(String[] args) {
try {
DefaultClientTlsStrategy tlsStrategy = new DefaultClientTlsStrategy(SSLContext.getDefault());
final PoolingHttpClientConnectionManager connectionManager = PoolingHttpClientConnectionManagerBuilder.create()
.setTlsSocketStrategy(tlsStrategy)
.setDefaultSocketConfig(SocketConfig.custom()
.setSoTimeout(Timeout.of(3, TimeUnit.SECONDS))
.build())
.setMaxConnPerRoute(20)
.setMaxConnTotal(200)
.build();
final RequestConfig requestConfig = RequestConfig.custom()
.setConnectionRequestTimeout(Timeout.of(1, TimeUnit.SECONDS))
.setConnectTimeout(Timeout.of(3, TimeUnit.SECONDS))
.setResponseTimeout(Timeout.of(3, TimeUnit.SECONDS))
.build();
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(requestConfig)
.evictExpiredConnections()
.build();
// Create GET request
final HttpGet httpGet = new HttpGet("https://httpbin.org/delay/5");
httpGet.setConfig(requestConfig);
// Log start time
long startTime = System.currentTimeMillis();
System.out.println("Executing GET request at: " + startTime);
try {
CloseableHttpResponse response = httpClient.execute(httpGet);
try {
long endTime = System.currentTimeMillis();
System.out.println("Response received after: " + (endTime - startTime) + "ms");
System.out.println("Response status: " + response.getCode());
System.out.println("Response body: " + EntityUtils.toString(response.getEntity()));
} finally {
response.close();
}
} catch (Exception e) {
long endTime = System.currentTimeMillis();
System.out.println("Exception after: " + (endTime - startTime) + "ms");
System.out.println("Exception type: " + e.getClass().getName());
System.out.println("Exception message: " + e.getMessage());
e.printStackTrace();
} finally {
httpClient.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
< /code>
Вывод: < /p>
App.verify.http.httpclienttimeoutexamplepoolinghttpclientConnectionManagerBuilder.main()> Запрос Get at: 1740675604245 < /p> > refecting at: 1740675604245 < /p> refecting at: 1740675604245 < /p> > refecting at: 1740675604245 < /p> [b] 6575ms [/b]
Тип исключения: java.net.sockettimeoutexception
Сообщение об исключении: чтение времени
[b] Я пробовал другой конфигурацию (уровень сокета, уровень подключения, уровень запроса), но не мог достичь функциональности времени. Код для использования PoolingHttpClientConnectionManager и Registry и все начало работать [/b]
public class HttpClientTimeoutExamplePoolingHttpClientConnectionManager {
public static void main(String[] args) {
try {
Registry registry = RegistryBuilder.create()
.register("http", PlainConnectionSocketFactory.getSocketFactory())
.register("https", SSLConnectionSocketFactory.getSocketFactory())
.build();
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry);
connectionManager.setDefaultSocketConfig(org.apache.hc.core5.http.io.SocketConfig.custom()
.setSoTimeout(Timeout.of(3, TimeUnit.SECONDS))
.build());
connectionManager.setMaxTotal(200);
connectionManager.setDefaultMaxPerRoute(20);
// Define request config with timeouts
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(Timeout.of(1, TimeUnit.SECONDS))
.setResponseTimeout(Timeout.of(3, TimeUnit.SECONDS))
.setConnectionRequestTimeout(Timeout.of(3, TimeUnit.SECONDS))
.build();
// Build the client with timeouts applied at connection manager level
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(requestConfig)
.evictExpiredConnections()
.build();
// Create GET request
final HttpGet httpGet = new HttpGet("https://httpbin.org/delay/5");
httpGet.setConfig(requestConfig);
// Log start time
long startTime = System.currentTimeMillis();
System.out.println("Executing GET request at: " + startTime);
try {
CloseableHttpResponse response = httpClient.execute(httpGet);
try {
long endTime = System.currentTimeMillis();
System.out.println("Response received after: " + (endTime - startTime) + "ms");
System.out.println("Response status: " + response.getCode());
System.out.println("Response body: " + EntityUtils.toString(response.getEntity()));
} finally {
response.close();
}
} catch (Exception e) {
long endTime = System.currentTimeMillis();
System.out.println("Exception after: " + (endTime - startTime) + "ms");
System.out.println("Exception type: " + e.getClass().getName());
System.out.println("Exception message: " + e.getMessage());
e.printStackTrace();
} finally {
httpClient.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
effecting get запрос на: 1740675734246
/> Исключение после: 3540ms < /strong> < /p>
Тип исключения: java.net.sockettimeoutexception < /p>
Сообщение об исключении: чтение времени устаревший класс? Или кто -нибудь может исправить меня неправильную конфигурацию - первый класс? (Было бы здорово, если бы вы могли использовать один и тот же код с 3 вторым тайм -аутом, которые достигли 5 -секундной конечной точки API задержки) < /p>
Я попробовал https://github.com/apache/httpcomponent ... ation.java код, когда я должен был привести к тому же, что и поведен к 3-тем же, что я и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же, и тот же урл. Настроил тайм -аут как 3 секунды,
Спасибо
Подробнее здесь: https://stackoverflow.com/questions/794 ... ient55-4-1