0

当我使用带有固定 ConnectionProvider 的 TCP 客户端时,我无法重用连接。

他们使连接超过了 maxConnection 变量。

这就是我写的。

即使我像 'ConnectionProvider.fixed("TEST", 10)' 那样使用 10 个 maxConnection,也有 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] 调试 reactor.netty.resources.PooledConnectionProvider - [id: 0x3444910e, L:/0:0:0:0:0:0:0:1:53928 !R:/0:0:0:0:0:0:0:1:33333] 通道已清理,现在 0 个活动连接和 22 个非活动连接

4

1 回答 1

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
于 2019-02-14T08:50:48.400 回答