为什么 HTTP 请求在设置超时后不抛出错误

Why does the HTTP request not throw an error after its set Timeout

提问人:Eric Olsen 提问时间:9/28/2023 更新时间:9/28/2023 访问量:18

问:

一些序言

我正在编写一个程序,将请求发送到设备上托管的 Web 服务器,如果设备插入了 USB,则端点下存在一个网页,我可以读取 USB 的内容。根据我的测试,设备可以处于 3 种状态/USB

  1. Web 服务器未启动 (java.net.ConnectException)
  2. USB 未插入设备(未找到 404)
  3. USB 存在且可读 (200 成功)

问题

我编写了一些代码,以便我可以在多个线程上遍历数百个设备并检查它们的 USB 和 Web 服务器状态(请参阅上面的 3 种状态),但是我注意到我的程序会挂起下面显示的一些 HTTP 请求是我向端点发出请求的方式HTTP

InetAddress Address = InetAddress.getByAddress(ipAddr);
HttpRequest req = HttpRequest.newBuilder()
                .header("Authorization", "Basic REDACTED")
                .uri(new URI("http://"+Address.getHostAddress()+"/usb/log/"))
                .timeout(Duration.ofMillis(5000))
                .GET()
                .build();
try{
    HttpResponse<String> res = this.Http.send(req, HttpResponse.BodyHandlers.ofString());
    System.out.println(res.statusCode());
    if(res.statusCode()==200){
        this.Usb=ConnectionState.NO_PROBLEM;
        this.GetLatestDate(res);
    }
    if(res.statusCode()==404){this.Usb=ConnectionState.NO_DEVICE;}
}catch (HttpTimeoutException e){
    System.out.println(e.getMessage());
    System.out.println("Failed to Connect?");
}catch (ConnectException e){
   System.out.println(e.toString());
   System.out.println("Webserver Did Not Boot Up");
   this.Usb = ConnectionState.NO_DEVICE;
}catch (Exception e){
   System.out.println(this.HmiID + " USB: "  + e.toString());
}

你应该注意到的是,我有.从我读到的内容来看,这应该会导致在 5 秒后抛出,但是理论上每个线程的运行时间不应超过 10 秒(考虑到线程中执行的其他逻辑).timeout(Duration.ofMillis(5000))HttpTimeoutException

那么为什么我有线程实例运行 151 秒,甚至 482 秒!?

我是否误解了从根本上是如何工作的?timeout

Java HTTP 错误处理

评论

0赞 user207421 9/28/2023
也许它只设置读取超时,而不是连接超时。

答: 暂无答案