我正在尝试HTTP/2
客户来自jdk 9-ea+171
。代码取自这个例子 https://labs.consol.de/development/2017/03/14/getting-started-with-java9-httpclient.html:
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("https://www.google.com/"))
.build();
HttpResponse<String> response
= client.send(request, HttpResponse.BodyHandler.asString());
但客户端永远挂在最后一行。请建议如何修复它?
调试显示它在方法中无限等待waitUntilPrefaceSent()
.
这是最新版本的 HTTP2 连接实现中的一个错误。以前的版本不会出现这种情况。
首先,您需要指定GET
方法来避免出现空指针异常。
发生的情况是主线程正在等待发送连接前言。它锁定一个倒计时锁存器以等待收到此前言。为了唤醒自己,任何HttpClient
创建一个读取传入流量的辅助线程。该线程应该唤醒主线程,但有时,这种情况永远不会发生。如果您经常运行您的示例,您会发现这有时有效。我想这是一场阅读序言的竞赛。
不幸的是,前言的阅读也不尊重任何超时,因此除了中断主线程之外,没有办法唤醒主线程。
这是官方门票:https://bugs.openjdk.java.net/browse/JDK-8181430 https://bugs.openjdk.java.net/browse/JDK-8181430
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)