微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java net HttpClient:对异步调用超时做出反应

如何解决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. CompletableFuture.exceptionally
  2. CompletableFuture.whenComplete
  3. CompletableFuture.handle
  • 1 允许您在发生异常时返回相同类型的结果
  • 2 允许您触发某些操作 - 并且不会更改完成 结果或异常。
  • 3 允许你触发一些动作,并改变完成的类型 结果或异常

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。