Java 9 HttpClient 挂起
Java 9 HttpClient hangs
我正在试验来自 jdk 9-ea+171
的 HTTP/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
方法,避免得到空指针异常
发生的情况是主线程正在等待发送连接序言。它锁定一个倒计时锁存器以等待接收此序言。为了唤醒自己,any HttpClient
创建了一个辅助线程来读取传入的流量。这个线程应该唤醒主线程,但有时,这永远不会发生。如果你 运行 你的例子,你会发现这有时会奏效。我猜是有一场阅读序言的竞赛。
不幸的是,前言的读取也不考虑任何超时,所以除了中断主线程外,没有办法唤醒主线程。
我正在试验来自 jdk 9-ea+171
的 HTTP/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
方法,避免得到空指针异常
发生的情况是主线程正在等待发送连接序言。它锁定一个倒计时锁存器以等待接收此序言。为了唤醒自己,any HttpClient
创建了一个辅助线程来读取传入的流量。这个线程应该唤醒主线程,但有时,这永远不会发生。如果你 运行 你的例子,你会发现这有时会奏效。我猜是有一场阅读序言的竞赛。
不幸的是,前言的读取也不考虑任何超时,所以除了中断主线程外,没有办法唤醒主线程。