首页 > 解决方案 > resttemplate 的默认 httpclient,具有读取超时的绝对值

问题描述

RestTemplate我有一个问题,即应用程序在使用来自 Spring Boot的调用后无限期阻塞。

ResponseEntity<String> response = restTemplate.postForEntity(destination.getUri(), request, String.class);

我们使用默认的标准 JDK 实现并像这样创建它:

    this.restTemplate = restTemplateBuilder
                       .setConnectTimeout(5000)
                       .setReadTimeout(5000)
                       .build();

它将连接和读取超时设置为 5 秒。但这似乎不是一个绝对值,一旦我们的应用程序接收到一些字节,这个读取超时就会重置,这会导致我们的应用程序无限期地等待。

我宁愿有一个绝对的读取超时,如果你在不到 5 秒内没有得到结束响应,模板会抛出一个TimeoutException.

我在默认客户端的选项中找不到类似的东西?

- -编辑 - -

我尝试了@Peekay 的答案,但它似乎不起作用:

    CloseableHttpClient httpClient = HttpClientBuilder.create()
           .setConnectionTimeToLive(1, TimeUnit.SECONDS)
           .setConnectionManager(new PoolingHttpClientConnectionManager())
           .build();

   HttpComponentsClientHttpRequestFactory clientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory();
   clientHttpRequestFactory.setHttpClient(httpClient);
   return new RestTemplate(clientHttpRequestFactory);

我还尝试了客户端RestTemplateeg的不同实现HttpComponentsClientHttpNetty4ClientOkHttp3Client像这样创建它们:

    Netty4ClientHttpRequestFactory factory = new Netty4ClientHttpRequestFactory();
    factory.setConnectTimeout(timeout);
    factory.setReadTimeout(readTimeout);
    return new RestTemplate(factory);

并在响应时间超过 5 秒的情况下对它们进行了测试。除了返回 a 的 Netty 之外,所有这些ReadTimeoutException都返回了 200 成功。不幸的是,我无法切换到该客户端,如果您想继续使用默认客户端,您似乎需要自己实现它。

标签: javaspringspring-boot

解决方案


你是对的,你不能设置绝对值,你必须中断胎面本身。


推荐阅读