Небольшое дополнение к статье Таймауты HttpClient в Java. Нашёл багу в HttpClient, который входит в состав Java 11 и выше. В моём случае была версия OpenJDK 25.0.2: Посмотрите на следующий код: Казалось бы, что всё хорошо, таймаут выставлен, но на некоторых URL этот код подвисает намертво. Установленный таймаут в 10 секунд не отрабатывает, хотя должен. … Читать далее Timeout в HttpClient не работает
Небольшое дополнение к статье Таймауты HttpClient в Java. Нашёл багу в HttpClient, который входит в состав Java 11 и выше. В моём случае была версия OpenJDK 25.0.2:
/java --version openjdk 25.0.2 2026-01-20 LTS OpenJDK Runtime Environment Temurin-25.0.2+10 (build 25.0.2+10-LTS) OpenJDK 64-Bit Server VM Temurin-25.0.2+10 (build 25.0.2+10-LTS, mixed mode, sharing) |
Посмотрите на следующий код:
HttpRequest getRequest = HttpRequest .newBuilder(new URI(blogUrl)) .timeout(Duration.ofSeconds(10L)) .GET().build(); statusCode = HttpClient.newHttpClient() .send(getRequest, BodyHandlers.ofString()) .statusCode(); |
Казалось бы, что всё хорошо, таймаут выставлен, но на некоторых URL этот код подвисает намертво. Установленный таймаут в 10 секунд не отрабатывает, хотя должен.
Всё дело в багах JDK-8208693 и JDK-8258397 . Исправление было в декабре 2025 года. Совсем недавно. В последних версиях Java всё должно работать. Например, в JDK 25.0.3 точно уже работает. Пока же в качестве обходного пути вместо BodyHandlers.ofString() и любых других можно использовать BodyHandlers.ofInputStream(), при использовании которого установленный таймаут отрабатывает.
HttpRequest getRequest = HttpRequest .newBuilder(new URI(blogUrl)) .timeout(Duration.ofSeconds(10L)) .GET() .build(); statusCode = HttpClient.newBuilder() .build() .send(getRequest, BodyHandlers.ofInputStream())// Так работает .statusCode(); |
Код из листинга выше работает даже в старых версиях JDK, даже в моей JDK 25.0.2.
| # | Наименование новости | Тональность | Информативность | Дата публикации |
|---|---|---|---|---|
| 1 | Один поток, а всё успевает: как работает цикл событий в JavaScript | 0 | 7.77 | 24-07-2026 |
| 2 | Когда TIME_WAIT становится врагом | -1 | 8.96 | 22-07-2026 |
| 3 | Как на самом деле работает .await: пишем свой async-рантайм на Rust с нуля | 0 | 8.59 | 21-06-2026 |
| 4 | 10 самых интересных ошибок в Java проектах за 2025 год | 0 | 12.89 | 26-12-2025 |
| 5 | Taskbar с живыми превью работающих приложений (олдскул на NET11) | 0 | 6 | 04-07-2026 |
| 6 | Netbeans 31 | 0 | 15.14 | 05-08-2026 |
| 7 | Терпение на исходе: как сбои в сервисах приводят к оттоку клиентов | -2 | 6 | 03-07-2026 |
| 8 | Терпение на исходе: как сбои в сервисах приводят к оттоку клиентов | -2 | 6 | 03-07-2026 |
| 9 | Терпение на исходе: как сбои в сервисах приводят к оттоку клиентов | -2 | 6 | 03-07-2026 |
| 10 | Spring WebFlux и MDC | 0 | 10.42 | 23-02-2026 |