Kotlin 如何在Reactor Netty WebClient中的某些不活动之后关闭TCP连接?
我想在一段时间不活动后关闭TCP连接。 所谓不活动,我的意思是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
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