Как я могу освободить пул соединения при использовании реактора tcpclient - PullRequest
0 голосов
/ 13 февраля 2019

Когда я использую TCP-клиент с фиксированным ConnectionProvider, я не могу повторно использовать соединение.

Они установили, что соединение превышает переменную maxConnection.

Это то, что я написал.

Даже если я использую 10 maxConnection, например «ConnectionProvider.fixed (« TEST », 10)»), существует 22 незанятых соединения.omg

// 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 [реактор-tcp-nio-5] ОТЛАДКАpipeline.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 неактивных соединения

1 Ответ

0 голосов
/ 14 февраля 2019

В примере, который вы разместили, вы делаете следующее:

  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
...