首页 > 解决方案 > 如何释放http连接

问题描述

我在我的应用程序中调用以下代码。第一个请求总是正常工作。我的问题是没有发送每个后续请求,当我指定超时值时,它会超时。否则它似乎无休止地等待。似乎第一个请求会阻止每次后续尝试的连接。如何确保再次正确释放连接?也许一些标题?也许某些属性(默认值用于 http https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/net/doc-files/net-properties.html)?

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) {
  // ...
}

使用:java.net.http.HttpClient (AdoptOpenJDK 11.0.7_10)

标签: javajava-11java-http-client

解决方案


send 方法是一个 Sync 方法,所以请求 get 阻塞直到你得到响应,在这种情况下你可能没有得到响应。

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

尝试使用异步方法

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

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

 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);

推荐阅读