当我将TCP客户端与固定的ConnectionProvider一起使用时,无法重用连接。
他们使连接超出了maxConnection变量。
这是我写的。
即使我使用10个maxConnection之类的“ ConnectionProvider.fixed(“ TEST”,10)“,也有22个空闲连接。天哪
// NettyClient.java
@AllArgsConstructor
public class NettyClient {
private final int port;
public final ConnectionProvider connectionProvider = ConnectionProvider.fixed("TEST", 10);
public void sendTest() {
TcpClient c = TcpClient
.create(connectionProvider)
.port(port)
.handle((in, out) -> {
return out
.sendString(Mono.just("string"))
.then(in
.receive()
.asString()
.flatMap(ss -> {
out.withConnection(connection -> {
connection.disposeNow();
});
return Mono.empty();
}));
})
.option(ChannelOption.SO_KEEPALIVE, true)
.wiretap(true);
c.connect().subscribe();
}
}
// NettyClientTest.java
public class NettyClientTest {
@Test
public void send() throws InterruptedException {
NettyClient nettyClient = new NettyClient(11);
for (int i = 0; i < 20; i++) {
nettyClient.sendTest();
}
nettyClient.sendTest();
nettyClient.sendTest();
}
}
14:55:27.397 [reactor-tcp-nio-5]调试反应堆.netty.resources.PooledConnectionProvider-[id:0x3444910e,L:/ 0:0:0:0:0:0:0:0:1: 53928! R:/ 0:0:0:0:0:0:0:1:33333]通道已清除,现在有0个活动连接和22个非活动连接
答案 0 :(得分:1)
在您发布的示例中,请执行以下操作:
out.withConnection(connection -> {
connection.disposeNow();
});
因此,每当您收到服务器的响应时,都会关闭连接。 由于有22个到服务器的请求,因此您将使用22个连接来执行测试。每个连接都首先返回到池中,然后由于您的请求而立即关闭。
Reactor Netty日志中缺少的正是连接关闭时的日志,因此我添加了此类日志。如果您尝试使用0.8.6.BUILD-SNAPSHOT版本,则可以在测试结束时看到:
10:36:42.341 [reactor-tcp-nio-3] DEBUG r.n.r.PooledConnectionProvider - [id: 0x0dad123c, L:/0:0:0:0:0:0:0:1:51530 ! R:/0:0:0:0:0:0:0:1:8080] Channel closed, now 0 active connections and 0 inactive connections