gpt4 book ai didi

java - 如何使用 Java 的 HttpClient 在慢速流响应主体上超时

转载 作者:行者123 更新时间:2023-12-04 11:08:27 25 4
gpt4 key购买 nike

当我需要以流方式处理响应时,我应该如何处理使用 Java 11 中包含的 HTTP 客户端挂起发送 HTTP 响应正文的服务器?
阅读文档后,我知道可以设置 timeout on connection和一个 timeout on the request :

HttpClient httpClient = HttpClient.newBuilder()
.connectTimeout(Duration.ofSeconds(2))
.build();

HttpRequest httpRequest = HttpRequest.newBuilder(URI.create("http://example.com"))
.timeout(Duration.ofSeconds(5))
.build();

HttpResponse<Stream<String>> httpResponse = httpClient
.send(httpRequest, HttpResponse.BodyHandlers.ofLines());

Stream<String> responseLineStream = httpResponse.body();
responseLineStream.count();
在上面的代码中:
  • 如果在 2 秒内无法建立连接,则会抛出超时异常。
  • 如果在 5 秒内没有收到响应,则会抛出超时异常。经实验,定时器在连接建立后开始计时,对于这种BodyHandler ,当收到状态行和标题时,就认为收到了响应。

  • 这意味着当代码执行时,在 7 秒内要么抛出异常,要么到达最后一行。但是,最后一行不受任何超时的限制。如果服务器停止发送响应正文,最后一行将永远阻塞。
    在这种情况下,如何防止最后一行挂起?

    最佳答案

    我的猜测是留给流的消费者,因为这是处理逻辑的一部分,所以仍然可以使用 CompletableFuture 处理主体处理。 :

    HttpResponse<Stream<String>> httpResponse = httpClient.send(httpRequest,
    HttpResponse.BodyHandlers.ofLines());

    Stream<String> responseLineStream = httpResponse.body();
    CompletableFuture<Long> future = CompletableFuture.supplyAsync(() -> responseLineStream.count());
    long count = future.get(3, TimeUnit.SECONDS);
    或者只是一个 Future由 Java 执行 Executor .

    关于java - 如何使用 Java 的 HttpClient 在慢速流响应主体上超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67602169/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com