java - 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);
我还尝试了客户端RestTemplate
eg的不同实现HttpComponentsClientHttp
,Netty4Client
并OkHttp3Client
像这样创建它们:
Netty4ClientHttpRequestFactory factory = new Netty4ClientHttpRequestFactory();
factory.setConnectTimeout(timeout);
factory.setReadTimeout(readTimeout);
return new RestTemplate(factory);
并在响应时间超过 5 秒的情况下对它们进行了测试。除了返回 a 的 Netty 之外,所有这些ReadTimeoutException
都返回了 200 成功。不幸的是,我无法切换到该客户端,如果您想继续使用默认客户端,您似乎需要自己实现它。
解决方案
你是对的,你不能设置绝对值,你必须中断胎面本身。
推荐阅读
- javascript - 如何访问 JavaScript 对象数组中的 PHP 变量
- javascript - 使用 vue.js 动态加载(可插入)组件
- azure-devops - 如何为构建失败时引发的错误指定迭代路径?
- node.js - MongoDB - 使用多个查找的 $gruop、辅助 $group、$sum 字段
- ssl - BizTalk Server 中的 Microsoft MQ 客户端绑定导致与 IBM MQ 的 SSL 连接握手失败
- javascript - 悬停下划线的边距问题
- spring-boot - 具有单个属性文件的 Spring 配置文件属性继承
- java - 如何按降序对 Java ArrayList 进行排序?
- java - 如何使用通用函数解析 json?
- javascript - 如何更改 bootstrap-datetimepicker 的视图以显示格式包含时间的日期?