当前位置: 首页 > 知识库问答 >
问题:

使用reactor tcpclient时,如何释放池连接

卢子民
2023-03-14

当我使用带有固定连接提供者的TCP客户端时,我不能重用连接。

他们使连接超过maxConnection变量。

这是我写的。

即使我使用10个maxConnection,比如“ConnectionProvider”。固定(“测试”,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]调试reactor。内蒂。资源。PooledConnectionProvider-[id:0x3444910e,L:/0:0:0:0:0:1:53928!R:/0:0:0:0:0:0:0:0:0:1:33333]通道已清理,现在0个活动连接和22个非活动连接

共有1个答案

贺雅健
2023-03-14

在您发布的示例中,您执行以下操作:

  out.withConnection(connection -> {
    connection.disposeNow();
  });

因此,每次收到服务器的响应时,都会关闭连接。由于有22个对服务器的请求,您将使用22个连接来执行测试。每个连接首先返回到池,然后立即关闭,因为这是您的请求。

ReactorNetty日志中缺少的正是连接关闭时的日志,所以我添加了这样的日志。如果您尝试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
 类似资料:
  • Tomcat在使用后不释放连接的原因可能是什么? 这是我的配置

  • 这是释放回池的连接的正确方法吗 只是想确保这是正确的,因为如果我不调用连接,我的连接不会被重新循环

  • 我使用HttpClient(https://hc.apache.org/httpcomponents-client-4.5.x/index.html)使许多超文本传输协议调用背靠背和并行。运行一段时间后,它会得到这个异常: 我试图关闭所有我能看到的东西,但我一定还是错过了一些东西,因为它仍然有那个错误。 如何正确释放连接以避免此连接泄漏问题? 下面是重现问题的测试用例,在Windows上以Java

  • 我正在尝试按照本教程实现nodejs mysql数据库。我知道 查询()是Pool.GetConnection()+Connection.Query()+Connection.Release()的快捷方式。 在本文中,数据库配置为: 这是可以用作: 但是,我真的不明白 如果使用pool会自动释放连接,为什么我们需要这样做呢?

  • 我使用的是spring-webflux-5.2.8。释放,此操作“正常”: 返回错误时,不会出现任何问题,因为连接已被破坏,并且不会放回连接池: 调试r.n.resources。PooledConnectionProvider-[id:0xa23f78ad,L:/127.0.0.1:7524!R:localhost/127.0.0.1:8443]通道已关闭,现在有0个活动连接和0个非活动连接 但当

  • 问题内容: 我遍历了一堆URL,对于每个URL,我都在执行以下操作: 第一个查询很好,第二个查询抛出此异常: 线程“主”中的异常java.lang.IllegalStateException:无效使用SingleClientConnManager:仍然分配了连接。在分配另一个之前,请确保释放连接。在org.apache.http.impl.conn.SingleClientConnManager。