【发布时间】:2020-09-07 22:25:44
【问题描述】:
我遇到一个问题,即应用程序在使用 Spring Boot 中的 RestTemplate 进行的 post call 时会无限期阻塞。
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);
我还尝试了客户端 RestTemplate 的不同实现,例如HttpComponentsClientHttp、Netty4Client 和 OkHttp3Client 像这样创建它们:
Netty4ClientHttpRequestFactory factory = new Netty4ClientHttpRequestFactory();
factory.setConnectTimeout(timeout);
factory.setReadTimeout(readTimeout);
return new RestTemplate(factory);
并在响应时间超过 5 秒的情况下对它们进行了测试。除了返回 ReadTimeoutException 的 Netty 之外,所有这些都返回了 200 成功。不幸的是,我无法切换到该客户端,如果您想继续使用默认客户端,您似乎需要自己实现它。
【问题讨论】:
标签: java spring spring-boot