java - 如何确保rector netty http客户端创建与http服务器的修复连接
问题描述
我使用下面的代码创建 reactor netty http 客户端并使用此客户端发送请求。
ConnectionProvider connectionProvider = ConnectionProvider.builder("lead")
.maxConnections(10)
.pendingAcquireTimeout(Duration.ofSeconds(60))
.pendingAcquireMaxCount(10)
.maxLifeTime(Duration.ofSeconds(100))
.maxIdleTime(Duration.ofSeconds(60))
.build();
HttpClient httpClient = HttpClient.create(connectionProvider)
.keepAlive(true);
我循环发送请求:
for (; ; ) {
httpClient.get().uri("http://localhost:5230/test")
.response()
.subscribe();
}
我希望 http 客户端只创建 10 个与 http 服务器的连接,但结果不如预期,客户端创建了许多与 http 服务器的连接(服务器侦听 5230 端口)(此连接很快关闭):
netstat -nap |grep "5230" 输出
TCP 127.0.0.1:5230 0.0.0.0:0 LISTENING 1980
TCP 127.0.0.1:5230 127.0.0.1:51012 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51014 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51015 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51016 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51017 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51018 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51019 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51020 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51021 ESTABLISHED 1980
TCP 127.0.0.1:5230 127.0.0.1:51022 ESTABLISHED 1980
TCP 127.0.0.1:50393 127.0.0.1:5230 TIME_WAIT 0
TCP 127.0.0.1:50394 127.0.0.1:5230 TIME_WAIT 0
TCP 127.0.0.1:50395 127.0.0.1:5230 TIME_WAIT 0
TCP 127.0.0.1:50396 127.0.0.1:5230 TIME_WAIT 0
TCP 127.0.0.1:50397 127.0.0.1:5230 TIME_WAIT 0
TCP 127.0.0.1:50398 127.0.0.1:5230 TIME_WAIT 0
TCP 127.0.0.1:50399 127.0.0.1:5230 TIME_WAIT 0
TCP 127.0.0.1:50400 127.0.0.1:5230 TIME_WAIT 0
TCP 127.0.0.1:50401 127.0.0.1:5230 TIME_WAIT 0
.... there is many connection in TIME_WAIT status....
如何确保 http 客户端只创建 10 个与 http 服务器的连接?
版本:
jdk 1.8.0_201
reactory-netty 1.0.3
netty 4.15.9.Final
解决方案
在Violeta Georgieva的帮助下,在 reacty nettyresponse()
方法中,http 客户端会关闭连接,因此 http 客户端会创建多个与服务器的连接:创建连接 -> 发送请求 -> 关闭连接。</p>
以下代码按预期工作:
httpClient.get().uri("http://127.0.0.1:5230/test")
.responseSingle(new BiFunction<HttpClientResponse, ByteBufMono, Mono<String>>() {
@Override
public Mono<String> apply(HttpClientResponse response, ByteBufMono byteBufMono) {
return byteBufMono.asString();
}
})
.subscribe();
推荐阅读
- android - recyclerView的速度控制
- c# - 如何修复 TypeLoadException (EmguCV + Unity3d)
- sql - 无法从子查询中选择列
- python - 在 Windows 的情况下使用多处理加速进程的启动
- python - 从地址中删除 matplotlib Line2D 对象
- html - 如何仅使用 css 绘制一颗心?
- c# - Azure 函数从 HttpTriggerFunction 访问 CloudBlobContainer
- node.js - 使用 socket.io 的 Nodejs 集群
- dictionary - 使用 mongoengine 编写一个空的 dict 字段
- javascript - 如何获取 URL,该浏览器用于 CSP