我正在使用带有连接缓冲池的react-netty http客户端(0.7.X系列),并且想配置缓冲池连接的空闲超时,但是不知道在哪里。
更准确地说,我需要以一种方式配置Reactor-netty http客户端连接池,使其自动关闭在可配置的超时时间内未发现任何活动的连接。这些连接是打开的,但是在某些(可配置)时间内,没有字节进出任何传输。
如何配置reacty-netty http客户端以抢先关闭空闲连接?
答案 0 :(得分:1)
在带有TCP客户端的Reactor-netty 0.9.x中最简单的方法是使用以下方法,我从@ Vladimir-L引用的link中获得了此方法。为您的问题配置“ maxIdleTime”。
TcpClient timeoutClient = TcpClient.create(ConnectionProvider.fixed(onnectionPoolName, maxConnections, acquireTimeout,maxIdleTime));
答案 1 :(得分:0)
通过在通道管道中添加netty写入和读取超时处理程序,我能够在0.7.x分支上完成此任务。但是,在0.8.x上,此方法不再有效。
HttpClient httpClient = HttpClient
.create((HttpClientOptions.Builder builder) -> builder
.host(endpointUrl.getHost())
.port(endpointUrl.getPort())
.poolResources(PoolResources.fixed(connectionPoolName, maxConnections, timeoutPool))
.afterChannelInit(channel -> {
channel.pipeline()
// The write and read timeouts are serving as generic socket idle state handlers.
.addFirst("write_timeout", new WriteTimeoutHandler(timeoutIdle, TimeUnit.MILLISECONDS))
.addFirst("read_timeout", new ReadTimeoutHandler(timeoutIdle, TimeUnit.MILLISECONDS));
})
.build());
答案 2 :(得分:0)
我设法配置了WebClient
(通过底层的TcpClient
),以便在超时时从 reactor-netty 0.8.9
我的解决方案部分基于关于IdleStateHandler的官方文档,并扩展了我在创建HttpClient
实例时如何正确应用它的研究。
这是我的做法:
public class IdleCleanupHandler extends ChannelDuplexHandler {
@Override
public void userEventTriggered(final ChannelHandlerContext ctx, final Object evt) throws Exception {
if (evt instanceof IdleStateEvent) {
final IdleState state = ((IdleStateEvent) evt).state();
if (state == IdleState.ALL_IDLE) { // or READER_IDLE / WRITER_IDLE
// close idling channel
ctx.close();
}
} else {
super.userEventTriggered(ctx, evt);
}
}
}
...
public static WebClient createWebClient(final String baseUrl, final int idleTimeoutSec) {
final TcpClient tcpClient = TcpClient.create(ConnectionProvider.fixed("fixed-pool"))
.bootstrap(bootstrap -> BootstrapHandlers.updateConfiguration(bootstrap, "idleTimeoutConfig",
(connectionObserver, channel) -> {
channel.pipeline()
.addLast("idleStateHandler", new IdleStateHandler(0, 0, idleTimeoutSec))
.addLast("idleCleanupHandler", new IdleCleanupHandler());
}));
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
.baseUrl(baseUrl)
.build();
}
答案 3 :(得分:0)
由于spring-boot-starter-webflux,我目前处于反应堆净值0.8.2,并且遇到相同的问题,连接池在连接完成后保持打开状态60秒钟。
使用这种方法,您无法配置超时,但是可以将其禁用:
WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(
HttpClient.from(TcpClient.create()).keepAlive(false)))
.build()
.get()
.uri("someurl")
.retrieve()
.bodyToMono(String.class)
答案 4 :(得分:0)
对于 Reactor Netty 版本 1,您需要创建一个 reactor.netty.resources.ConnectionProvider
,其中将包含空闲时间配置,然后在创建 reactor.netty.http.client.HttpClient
时使用它。
我使用的是 Spring,所以我使用它来创建一个 Spring org.springframework.http.client.reactive.ClientHttpConnector
,如下所示。
ConnectionProvider connectionProvider = ConnectionProvider.builder("Name")
.maxIdleTime(Duration.ofSeconds(10))
.build();
HttpClient httpClient = HttpClient.create(connectionProvider)
.compress(true);
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.baseUrl(host);