Java 9 HttpClient 挂起

标签 java http2 java-9

我正在试验来自 jdk 9-ea+171HTTP/2 客户端。代码取自this example :

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

关于Java 9 HttpClient 挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44266022/

相关文章:

android - 为什么 Xamarin Android 无法发送 GRPC/Http2 请求?

php - HTTP/2 服务器推送无法正常工作,我做错了什么?

java - Jetty 在使用 http2 时以状态 200 而不是 304 响应

java - 为 Java SDK 9 更新 IntelliJ (macOS)

java - java 9 中 javax.activation 包的替代品是什么?

java - "java.lang.UnsatisfiedLinkError: no awt in java.library.path"正在运行 JWS Swing 应用程序

java - 使用 while 循环检查任务何时完成时 GUI 被阻塞

java - 如何将按钮引用 Activity 传递给适配器android

exception - GlassFish 5.0 异常且端口 4848 无响应

java - 为什么 DOM 文档在实际有效时会显示为 null?