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

获取和释放与TcpClient连接池的连接(ReactorNetty)

危飞文
2023-03-14

我已经按照这里的示例中所述配置了TcpClient。我试图使以下代码在服务器意外关闭连接的情况下具有弹性:

TcpClient tcpClient = getTcpClient();

public Mono<String> sendMessage(Mono<bytes[]> request) {
    Connection connection = getConnectionFromPool(tcpClient);
    return connection
        .outbound()
        .sendByteArray(request)
        .then()
        .then(connection.inbound().receive().asString().as(Mono::from));
}

在这种情况下,我希望方法“getConnectionFromPool”能够从池中检索连接,或者如果没有可用的连接,则打开一个新连接。

注意到后。connect()最终服从于ConnectionProvider。acquire(),我尝试使用tcpClient。connect(),但有必要更改方法返回类型,如下所示:

public Mono<Mono<String>> sendMessage1(Mono<String> request) {
    return this.tcpClient
        .connect()
        .map(connection ->
            connection
                .outbound()
                .sendByteArray(request.map(String::getBytes))
                .then()
                .then(connection.inbound().receive().asString().as(Mono::from))
            );
}

显然这是不可取的。如何直接从池中获取Connection实例?我是否缺少一个简单的Mono运算符,或者我是否错误地使用了TcpClient API?

非常感谢任何帮助。

共有1个答案

郜俊健
2023-03-14

用平面地图代替地图怎么样?

public Mono<String> sendMessage1(Mono<String> request) {
    return this.tcpClient
            .connect()
            .flatMap(connection ->
                    connection
                            .outbound()
                            .sendByteArray(request.map(String::getBytes))
                            .then()
                            .then(connection.inbound().receive().asString().as(Mono::from))
            );
}
 类似资料:
  • 当我使用带有固定连接提供者的TCP客户端时,我不能重用连接。 他们使连接超过maxConnection变量。 这是我写的。 即使我使用10个maxConnection,比如“ConnectionProvider”。固定(“测试”,10)”,有22个空闲连接。天啊 //NettyClient.java //NettyClientTest。Java语言 14:55:27.397[reactor-tcp

  • 我正在尝试在建立Tcp连接后建立Udp连接。所有连接状态和控制都通过Tcp进行,但我希望客户端和服务器也能够通过Udp进行通信。这是我的问题。 服务器将有许多客户端在单独的线程上连接到它。我让它 0 在仅绑定 Tcp 的情况下工作正常,但我想使用 Udp。由于 Udp 打孔,我很难侦听 Udp 上的特定endpoint,因为endpoint在与 NAT 设备通信时可能会发生变化。 因此,简单地提出

  • Tomcat在使用后不释放连接的原因可能是什么? 这是我的配置

  • 在我的程序中,我正在访问wep api。最多可以有7个不同的线程访问web api的不同服务器。每个线程负责一个服务器,每个服务器速率限制每个线程。每个线程更新相同的mysql数据库。线程数保持不变。 在我的示例中,是否需要连接池?我不应该只打开7个不同的连接,这些连接将在程序的生命周期中打开吗?

  • 我正在重构一个最初设计于20世纪90年代中期的遗留系统。在那些日子里,JDBC连接是一种稀缺资源,没有可靠的连接池实现,因此连接被保持得尽可能长。这导致以下结构: 这只是一个例子来说明这种结构中的数据库连接 > 提前打开 会长期开放 传递给所有必须访问数据库的人 现在,在重构过程中,我想删除这种操作模式。考虑到连池和操作尽可能无状态,我可以想象删除数据库连接的每一次传递,并在我需要的时候简单地(从

  • 我使用的是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个非活动连接 但当