Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何释放http连接_Java_Java 11_Java Http Client - Fatal编程技术网

Java 如何释放http连接

Java 如何释放http连接,java,java-11,java-http-client,Java,Java 11,Java Http Client,我在我的应用程序中调用以下代码。第一个请求总是运行良好。我的问题是,当我指定一个超时值时,并没有发送下面的每个请求,它会进入超时。否则,它似乎在无休止地等待。第一个请求似乎会阻止后续每次尝试的连接。如何确保再次正确释放连接?也许是头球?可能有一些属性(默认值用于http) HttpRequest请求=HttpRequest.newBuilder() .version(HttpClient.version.HTTP_1_1) .GET() .uri(uri.create(url)) .build(

我在我的应用程序中调用以下代码。第一个请求总是运行良好。我的问题是,当我指定一个超时值时,并没有发送下面的每个请求,它会进入超时。否则,它似乎在无休止地等待。第一个请求似乎会阻止后续每次尝试的连接。如何确保再次正确释放连接?也许是头球?可能有一些属性(默认值用于http)

HttpRequest请求=HttpRequest.newBuilder()
.version(HttpClient.version.HTTP_1_1)
.GET()
.uri(uri.create(url))
.build();
试一试{
HttpResponse response=client.send(请求,HttpResponse.BodyHandlers.ofFile(path.get(outfile));
}捕获(IOException | InterruptedException e){
// ...
}

已使用:java.net.http.HttpClient(采用OpenJDK 11.0.7_10)

发送方法是一种同步方法,因此请求get阻塞,直到您得到响应为止,在这种情况下,您可能没有得到响应

send(HttpRequest,BodyHandler)阻塞,直到发送请求并收到响应。

尝试使用异步方法

sendAsync(HttpRequest,BodyHandler)异步发送请求并接收响应。 sendAsync方法立即返回一个完整的future。CompletableFuture在响应可用时完成。返回的CompletableFuture可以以不同的方式组合,以声明多个异步任务之间的依赖关系

异步请求示例(取自apidoc):


我建议也调查服务器端,据我所知,我不认为这是连接问题。从同一台服务器上没有下载请求可以正常工作,只有此下载会产生问题。后续请求被阻塞是什么意思?你能告诉代码你是如何多次调用这个方法的吗?作为帮助调试的开始,我建议记录堆栈发出的请求/响应:
-Djdk.httpclient.httpclient.log=errors,requests,headers
,第一个请求工作正常,第二个请求甚至没有发出。我也试着改变顺序,同样的behevior-第一个发送的请求有效,第二个被阻止。但是我将使用sendAsync,也许会有帮助,谢谢
HttpRequest request = HttpRequest.newBuilder()
                .version(HttpClient.Version.HTTP_1_1)
                .GET()
                .uri(URI.create(url))
                .build();
try {
  HttpResponse<Path> response = client.send(request, HttpResponse.BodyHandlers.ofFile(Paths.get(outfile)));
} catch (IOException | InterruptedException e) {
  // ...
}
 HttpRequest request = HttpRequest.newBuilder()
        .uri(URI.create("https://example.com/"))
        .timeout(Duration.ofMinutes(2))
        .header("Content-Type", "application/json")
        .POST(BodyPublishers.ofFile(Paths.get("file.json")))
        .build();
   client.sendAsync(request, BodyHandlers.ofString())
        .thenApply(HttpResponse::body)
        .thenAccept(System.out::println);