webservicetemplate - PoolingHttpClientConnectionManager - TTL 构造函数和相关问题
问题描述
我正在创建 HttpComponentsMessageSender bean,如下所示
@Bean
public HttpComponentsMessageSender reservationHttpComponent() {
HttpComponentsMessageSender httpComponentsMessageSender = new HttpComponentsMessageSender();
httpComponentsMessageSender.setConnectionTimeout(reservationConnectionTimeOut);
httpComponentsMessageSender.setReadTimeout(reservationReadTimeOut);
return httpComponentsMessageSender;
}
在这里,我遇到了间歇性读取超时问题 - 就像我在休息 30 分钟后第一次尝试时,我遇到了读取超时,之后所有进一步的交易都成功了。如果再次休息 30 分钟,那么第一次交易又因读取超时问题而失败,然后所有进一步都成功......
我尝试修复如下代码 -
@Bean
public HttpComponentsMessageSender reservationHttpComponent() {
RequestConfig requestBuilder = RequestConfig.custom()
.setSocketTimeout(reservationReadTimeOut)
.setConnectionRequestTimeout(reservationConnectionTimeOut)
.setConnectTimeout(reservationConnectionTimeOut)
.setCircularRedirectsAllowed(false)
.build();
org.apache.http.client.HttpClient httpClient = HttpClientBuilder.create()
.setConnectionManager(getConnManager())
.addInterceptorFirst(new HttpComponentsMessageSender.RemoveSoapHeadersInterceptor())
.setDefaultRequestConfig(requestBuilder)
.build();
HttpComponentsMessageSender messageSender = new HttpComponentsMessageSender();
messageSender.setHttpClient(httpClient);
return messageSender;
}
private PoolingHttpClientConnectionManager getConnManager() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setDefaultMaxPerRoute(connectionManagerDefaultMaxPerRoute);
connectionManager.setMaxTotal(connectionManagerMaxTotal);
connectionManager.setDefaultSocketConfig(SocketConfig.custom()
.setSoTimeout(reservationReadTimeOut).build());
return connectionManager;
}
上面已经解决了读取超时问题,但后来我开始遇到以下问题-
message:Error Occurred While Retrieving Reservation - I/O error: Timeout waiting for connection from pool; nested exception is org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
我正在寻找修复,然后我尝试使用 TTL 初始化 PoolingHttpClientConnectionManager -
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(1, TimeUnit.MINUTES)
然后我运行了多个性能 jmx 脚本,我在我的服务上触发了 70 - 80 TPS,上面有外部依赖的代码,一切看起来都很好。
但是我不确定在 PoolingHttpClientConnectionManager 构造函数中是否有 TTL 是非常合适的解决方案。所以在这里我正在寻找有关此解决方案是否会导致任何进一步问题或其他任何可能是比这更好的方法的建议。
解决方案
推荐阅读
- powerbi - 在 Power BI 的表上显示空白而不是 0
- firebase - 如何从firebase获取今天日期的所有记录
- django - 如何使用 JSON 数据从浏览器模拟对 Django Rest Framework 中的 REST API 端点的 GET 调用
- angular - 在 Angular 中将无组件路由与子路由深度链接
- asp.net - MIcrosoft Dynamics CRM - 没有足够的存储空间来完成此操作
- android - 将 SearchView 查询从起始片段传递到另一个片段
- java - 为什么 Junit TestRunner 找不到功能?
- python - Casacore 未在 OS X 上安装
- c++ - 是否可以在 RTL 中进行控制台输出(从右到左)?
- proxy - 为什么我的一些网站在学校被封锁以及如何解除封锁?