Kotlin 如何在Reactor Netty WebClient中的某些不活动之后关闭TCP连接?

Kotlin 如何在Reactor Netty WebClient中的某些不活动之后关闭TCP连接?,kotlin,netty,spring-webflux,spring-webclient,reactor-netty,Kotlin,Netty,Spring Webflux,Spring Webclient,Reactor Netty,我想在一段时间不活动后关闭TCP连接。 所谓不活动,我的意思是TCP连接在一定时间内没有被使用 我想我会为此使用连接处理程序 private val webClient = webClientBuilder .build() .mutate() .filters(MutableList<ExchangeFilterFunction>::clear) .clientConnector( ReactorClientHttpConnector

我想在一段时间不活动后关闭TCP连接。 所谓不活动,我的意思是TCP连接在一定时间内没有被使用

我想我会为此使用连接处理程序

private val webClient = webClientBuilder
    .build()
    .mutate()
    .filters(MutableList<ExchangeFilterFunction>::clear)
    .clientConnector(
        ReactorClientHttpConnector(
            HttpClient.from(
                TcpClient.create()
                    .option(CONNECT_TIMEOUT_MILLIS, CONNECT_TIMEOUT)
                    .doOnConnected { connection ->
                        connection
                            .addHandlerLast(
                                IdleStateHandler(
                                    SOCKET_INACTIVITY_TIMEOUT,
                                    SOCKET_INACTIVITY_TIMEOUT,
                                    0
                                )
                            )
                            .addHandlerLast(CloseIdleConnectionHandler())
                            .addHandlerLast(ReadTimeoutHandler(READ_TIMEOUT))
                            .addHandlerLast(WriteTimeoutHandler(WRITE_TIMEOUT))
                    }
            )
        )
    )
    .build()

companion object {
    const val SOCKET_INACTIVITY_TIMEOUT = 20
    const val CONNECT_TIMEOUT = 5_000
    const val READ_TIMEOUT = 5
    const val WRITE_TIMEOUT = 5
}

private class CloseIdleConnectionHandler : ChannelDuplexHandler() {
    override fun userEventTriggered(ctx: ChannelHandlerContext, evt: Any) {
        if (evt is IdleStateEvent) {
            ctx.disconnect()
        }
    }
}
private val webClient=webClientBuilder
.build()
.mutate()
.filters(可变列表::清除)
.客户端连接器(
反应器客户端TTP连接器(
HttpClient.from(
TcpClient.create()
.选项(连接超时,连接超时)
.doOnConnected{连接->
连接
addHandlerLast先生(
IdleStateHandler(
套接字\u不活动\u超时,
套接字\u不活动\u超时,
0
)
)
.addHandlerLast(CloseIdleConnectionHandler())
.addHandlerLast(ReadTimeoutHandler(读取超时))
.addHandlerLast(WriteTimeoutHandler(写入超时))
}
)
)
)
.build()
伴星{
const val套接字\u不活动\u超时=20
const val CONNECT_TIMEOUT=5_000
const val READ_TIMEOUT=5
常量值写入超时=5
}
私有类CloseIdleConnectionHandler:ChannelDuplexHandler(){
重写有趣的userEventTriggered(ctx:ChannelHandlerContext,evt:Any){
if(evt为IDLESTATEVENT){
ctx.disconnect()
}
}
}
问题是
CloseIdleConnectionHandler
SOCKET\u非活动\u超时后不会被调用


我是做错了什么还是误用了
idlestateholder

您可以使用
ConnectionProvider.builder
来配置这些设置

        ConnectionProvider connectionProvider =
            ConnectionProvider.builder("my-connection-pool")
                    .maxConnections(100)
                    .pendingAcquireTimeout(Duration.ofMillis(100))
                    // this is the setting you're after
                    .maxIdleTime(Duration.ofMillis(1000))
                    .maxLifeTime(Duration.ofMillis(5000))
                    .build()
然后,在构建tcp客户端时,将连接提供程序传入

TcpClient.create(connectionProvider)
         .options(..... // other custom configuration