【问题标题】:How to release the http connection如何释放http连接
【发布时间】:2020-10-13 13:40:27
【问题描述】:

我在我的应用程序中调用以下代码。第一个请求总是正常工作。我的问题是没有发送每个后续请求,当我指定超时值时,它会超时。否则它似乎无休止地等待。似乎第一个请求会阻止每次后续尝试的连接。如何确保再次正确释放连接?也许一些标题?也许有些属性(默认用于 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)

【问题讨论】:

  • 我也建议调查服务器端,据我所知,我不认为这是连接问题
  • 没有下载请求从同一台服务器正常工作,只有这个下载会产生问题
  • 后续请求被阻塞是什么意思?你能显示代码你是如何多次调用这个方法的吗?
  • 作为帮助调试的开始,我建议记录堆栈发出的请求/响应:-Djdk.httpclient.HttpClient.log=errors,requests,headers

标签: java java-11 java-http-client


【解决方案1】:

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

【讨论】:

  • 正如所说的第一个请求工作正常,第二个请求甚至没有发出。我还尝试更改顺序,同样的行为 - 第一个发送的请求有效,第二个被阻止。但是我要玩一下 sendAsync,也许它会有所帮助,谢谢
猜你喜欢
  • 2011-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-15
  • 1970-01-01
  • 2012-07-11
  • 2014-08-06
相关资源
最近更新 更多