Таймаут запроса в Java
Долгий ответ можно оборвать по времени. У
построителя HttpRequest есть
timeout с Duration - счетчик
идет на весь обмен, включая чтение тела.
Путь "/delay/1" на httpbin.org
ждет около секунды перед ответом. Лимит короче
этой паузы приводит к исключению:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.net.http.HttpTimeoutException;
import java.time.Duration;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder().build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/delay/1"))
.timeout(Duration.ofMillis(300))
.GET()
.build();
try {
client.send(
request,
HttpResponse.BodyHandlers.ofString(),
);
} catch (HttpTimeoutException ex) {
System.out.println("timeout");
}
}
}
Отдельно задают connectTimeout на
HttpClient - он ограничивает только
установку соединения. Для медленного ответа после
коннекта нужен именно timeout запроса:
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
public class Main {
public static void main(String[] args) throws Exception {
HttpClient client = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(5))
.build();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create("https://httpbin.org/delay/1"))
.timeout(Duration.ofMillis(400))
.GET()
.build();
System.out.println(request.timeout().get().toMillis());
}
}
Отправьте чтение на "/delay/1" с
лимитом 200 миллисекунд. Выведите
"timeout", если сработало
исключение по времени.
Выведите "ok", если запрос к
"/delay/1" успел завершиться при
лимите 3 секунды, и "timeout"
при более коротком лимите 100
миллисекунд - две строки подряд.