Java 9 HttpClient зависает


person awfun    schedule 30.05.2017    source источник
comment
Я могу заставить его работать, если я использую другую перегрузку newBuilder, которая принимает URI напрямую, и я использую http вместо https. Я получаю NPE с https.   -  person Jorn Vernee    schedule 30.05.2017
comment
Это работает с http, потому что клиент использует HTTP/1.1, как мы можем видеть из response.version(). Мне нужен именно https и преимущества HTTP/2 протокола.   -  person awfun    schedule 30.05.2017
comment
Я столкнулся с NPE, когда не был указан метод запроса (например, GET).   -  person awfun    schedule 30.05.2017
comment
Это ошибка: bugs.openjdk.java.net/browse/JDK-8181430   -  person Rafael Winterhalter    schedule 01.06.2017


Ответы (1)


Это ошибка в реализации соединения HTTP2 в последней сборке. Это не происходит с предыдущими сборками.

Прежде всего, вам нужно указать метод GET, чтобы избежать получения исключения нулевого указателя.

Что происходит, так это то, что основной поток ожидает отправки предисловия к соединению. Он запирает защелку обратного отсчета в ожидании получения этого предисловия. Чтобы разбудить себя, любой HttpClient создает вспомогательный поток, который считывает входящий трафик. Этот поток должен разбудить основной поток, но иногда этого не происходит. Если вы будете запускать свой пример достаточно часто, вы увидите, что иногда это работает. Я предполагаю, что есть гонка для чтения предисловия.

К сожалению, чтение предисловия также не учитывает тайм-аут, поэтому нет никакого способа разбудить основной поток, кроме прерывания основного потока.

Вот официальный билет: https://bugs.openjdk.java.net/browse/JDK-8181430

person Rafael Winterhalter    schedule 31.05.2017