问题描述
我的目标是对 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
}
});