Вход на сайт

Просмотр новости

Найдите то, что Вас интересует

Timeout в HttpClient не работает

Дата публикации: 16-06-2026 07:59:58

Небольшое дополнение к статье Таймауты 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Один поток, а всё успевает: как работает цикл событий в JavaScript07.7724-07-2026
2Когда TIME_WAIT становится врагом-18.9622-07-2026
3Как на самом деле работает .await: пишем свой async-рантайм на Rust с нуля08.5921-06-2026
410 самых интересных ошибок в Java проектах за 2025 год012.8926-12-2025
5Taskbar с живыми превью работающих приложений (олдскул на NET11)0604-07-2026
6Netbeans 31015.1405-08-2026
7Терпение на исходе: как сбои в сервисах приводят к оттоку клиентов-2603-07-2026
8Терпение на исходе: как сбои в сервисах приводят к оттоку клиентов-2603-07-2026
9Терпение на исходе: как сбои в сервисах приводят к оттоку клиентов-2603-07-2026
10Spring WebFlux и MDC010.4223-02-2026

Классификация: . Схожих патентов: 0. Схожих новостей: 10. Тональность: 0. Информативность: 11.88. Источник: urvanov.ru.