提问人:Eric Olsen 提问时间:9/28/2023 更新时间:9/28/2023 访问量:18
为什么 HTTP 请求在设置超时后不抛出错误
Why does the HTTP request not throw an error after its set Timeout
问:
一些序言
我正在编写一个程序,将请求发送到设备上托管的 Web 服务器,如果设备插入了 USB,则端点下存在一个网页,我可以读取 USB 的内容。根据我的测试,设备可以处于 3 种状态/USB
- Web 服务器未启动 (java.net.ConnectException)
- USB 未插入设备(未找到 404)
- 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
答: 暂无答案
评论