java - 如何释放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)
解决方案
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);
推荐阅读
- ios - 可供 AVSpeechSynthesis 在 iOS 中使用的已安装语音的可用性
- r - R在列表列表中用`sapply`替换`for`
- bash - 如何解决 USDZConvert Pxr 导入错误?
- node.js - 如何以编程方式确定终端是否支持 UTF8?
- node.js - React TypeScript 在 Windows 上构建项目,但不在 Linux 上
- mysql - 如何检测数据类型以从 R 创建 MySql 表
- swift - ARC 不适用于 struct 和 enum,它们是如何在 Swift 中释放的
- android-studio - Gradle 卡在 assembleDebug
- rust - Rust 在一行中输入 3 个整数
- vue.js - 如果浏览器是 Internet Explorer 11,如何防止 App.js 中的导入