首页 > 解决方案 > java.net.http.HttpClient 中的超时未按预期工作

问题描述

连接到 API 时,具有 100 毫秒超时的 Java Http 客户端会引发超时异常。

  1. 我已经验证 api 在 10 毫秒内通过 curl 调用做出响应。

    curl --max-time 0.01 http://localhost:8000/

    @Test
    public void testHTTPClient() throws URISyntaxException, IOException, InterruptedException {


        HttpClient client = HttpClient.newBuilder().build().newHttpClient();
        java.net.URI uri = new URI("http://localhost:8000/");
        HttpRequest req = HttpRequest.newBuilder(uri).GET().timeout(Duration.ofMillis(100)).build();
        long start = Instant.now().toEpochMilli();
        try {
            java.net.http.HttpResponse<String> response = client.send(req, java.net.http.HttpResponse.BodyHandlers.ofString());
            System.out.println(response.body());
        } catch (HttpTimeoutException e) {
            System.out.println("Time taken " + (Instant.now().toEpochMilli() - start));
            e.printStackTrace();
        }

    }

我期待输出打印到屏幕上。但我得到以下异常。

Time taken 159

java.net.http.HttpTimeoutException: request timed out
    at java.net.http/jdk.internal.net.http.HttpClientImpl.send(HttpClientImpl.java:559)
    at java.net.http/jdk.internal.net.http.HttpClientFacade.send(HttpClientFacade.java:119)

当我以 100 毫秒超时多次运行测试时。很少有实例有成功的响应。对于像 150 毫秒这样的较大超时,我没有遇到超时异常。

标签: java

解决方案


推荐阅读