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

最后一个调用只是对超时的反应的占位符,不存在。但我如何将其存档?

根据您正在尝试的操作,当发生异常时,至少有三种方法可以用来执行操作:

  1. 复杂的未来。异常
  2. 可完成的未来
  3. CompletableFuture.handle
  • 1允许您在发生异常时返回相同类型的结果
  • 2允许你触发一些动作,但不会改变完成结果或异常
  • 3允许您触发一些操作,并更改完成类型结果或异常

到目前为止,最简单的方法是使用2。类似于:

client.sendAsync(request, HttpResponse.BodyHandlers.ofInputStream())
.whenComplete((r,x) -> {
if (x instanceof HttpTimeoutException) {
// do something
}
});

相关内容

  • 没有找到相关文章

最新更新