Изменения в библиотеках ядра java.net. Были внесены следующие четыре изменения:
· Входные потоки HTTP-ответов при прерывании выбрасывает исключение
IOException. Когда вы используете метод ResponseSubscribers::ofInputStream, он
возвращает экземпляр InputStream, известный как входной поток ответа HTTP. В
Java 20 реализация метода чтения по умолчанию в этих потоках была изменена.
В предыдущих версиях, если поток, выполняющий операцию чтения, был прерван,
прерывание игнорировалось. Однако, в новых версиях, если тот же поток будет
прерван во время блокировки операции чтения, то запрос будет отменен. Входной
поток будет закрыт, статус прерывания потока будет установлен в true, и будет
выброшено исключение IOException.
· Конструкторы URL, вызываемые с неправильным форматов ввода, могут
выбросить исключение MalformedURLException в тех случаях, когда оно не было
вызвано ранее. В Java 20 способ разбора входных данных в конструкторах URL
стал более строгим. Если вы вызовете эти конструкторы с неправильно
отформатированными входными данными, вы можете получить исключение
MalformedURLException, которое раньше не возникало.
Раньше некоторые проверки валидации и парсинга выполнялись при вызове
методов URL::openConnection или URLConnection::connect. Теперь эти проверки
выполняются раньше, в самих конструкторах URL. Это означает, что если
возникает проблема с форматированием URL, которая ранее могла быть
обнаружена только при открытии соединения, то теперь может быть выброшено
исключение MalformedURLException при создании самого URL.
Это изменение затрагивает только те URL, которые используют встроенные в JDK
реализации обработчиков потоков. URL, использующие сторонние реализации, не
затрагиваются. Чтобы вернуться к предыдущему поведению, установите системное
свойство -Djdk.net.url.delayParsing=true при запуске вашей программы. Обратите
внимание, что это свойство предоставлено для обратной совместимости и может
быть удалено в будущем.
· В Java 20 было изменено значение таймаута по умолчанию для неработающих
соединений, создаваемых java.net.http.HttpClient. Время ожидания HttpClient по
умолчанию теперь составляет 30 секунд. Это означает, что если соединение будет
простаивать в течение 30 секунд, оно будет закрыто HttpClient. Ранее значение
тайм-аута по умолчанию для соединений HTTP/1.1 и HTTP/2 составляло 1200
секунд.
· Java 20 вводит тайм-аут неработающего соединения для HTTP/2. Свойство
jdk.httpclient.keepalivetimeout можно использовать для установки общесистемного
значения в секундах для закрытия неработающих соединений для HTTP/1.1 и HTTP/2 при использовании HttpClient. Кроме того, вы можете использовать
свойство jdk.httpclient.keepalivetimeout.h2 для установки значения таймаута
исключительно для HTTP/2, независимо от того, установлено ли свойство
jdk.httpclient.keepalivetimeout во время выполнения.