如何解决Java net HttpClient:对异步调用超时做出反应
我的目标是对 HttpClient 的异步调用中的超时做出反应。我找到了很多关于如何设置不同超时的信息,但我没有找到任何关于超时发生时如何应对的信息。
文档说明:
如果在指定的超时时间内未收到响应,则 HttpClient::send 抛出 HttpTimeoutException 或 HttpClient::sendAsync 异常完成并引发 HttpTimeoutException
但我不知道什么是异常完成。
示例
在同步调用中我可以做(如果测试 URL 后面的服务器没有应答):
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("http://localhost:8080/api/ping/public"))
.timeout(Duration.ofSeconds(2))
.build();
HttpClient client = HttpClient.newBuilder().build();
try {
client.send(request,HttpResponse.BodyHandlers.ofInputStream());
} catch (HttpTimeoutException e) {
System.out.println("Timeout");
}
我现在想要的是对异步调用做同样的反应:
HttpRequest request = HttpRequest.newBuilder()
.uri(new URI("http://localhost:8080/api/ping/public"))
.timeout(Duration.ofSeconds(2))
.build();
HttpClient client = HttpClient.newBuilder().build();
client.sendAsync(request,HttpResponse.BodyHandlers.ofInputStream()).thenIfTimeout(System.out.println());
最后一次调用只是超时反应的占位符,不存在。但我该如何存档?
解决方法
根据您尝试执行的操作,至少可以使用三种方法在发生异常时采取措施:
到目前为止,最简单的方法是使用 2。类似的东西:
client.sendAsync(request,HttpResponse.BodyHandlers.ofInputStream())
.whenComplete((r,x) -> {
if (x instanceof HttpTimeoutException) {
// do something
}
});
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。