我的目标是对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());
最后一个调用只是对超时的反应的占位符,不存在。但我如何将其存档?
根据您正在尝试的操作,当发生异常时,至少有三种方法可以用来执行操作:
- 复杂的未来。异常
- 可完成的未来
- CompletableFuture.handle
- 1允许您在发生异常时返回相同类型的结果
- 2允许你触发一些动作,但不会改变完成结果或异常
- 3允许您触发一些操作,并更改完成类型结果或异常
到目前为止,最简单的方法是使用2。类似于:
client.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
.whenComplete((r,x) -> {
if (x instanceof HttpTimeoutException) {
// do something
}
});