Reactor Netty - 保持活动状态

问题描述 投票:0回答:1

我有一个使用 Webflux 的应用程序,我正在尝试在服务器上启用

keepalive

我做了以下事情:

@Component
public class ServerConfiguration
    implements WebServerFactoryCustomizer<NettyReactiveWebServerFactory>
{
    private static final int TIMEOUT = 10;

    @Override
    public void customize( NettyReactiveWebServerFactory factory )
    {
        factory.addServerCustomizers( httpServer -> httpServer.doOnConnection( connection -> {
            connection.channel().config().setOption( SO_KEEPALIVE, true );
            connection.addHandlerLast( new IdleStateHandler( 0, TIMEOUT, 0 ) );
        } ) );
    }
}

我希望服务器每 10 秒发送一次

keepalive
,但它似乎不起作用。

我缺少什么?

谢谢

java spring-webflux netty keep-alive reactor-netty
1个回答
1
投票

如果我是对的,Netty IdleStateHandler 不会发送 ping 消息,它只是在 Channel 一段时间内没有执行读、写或两者操作时触发 IdleStateEvent。

现在,要在服务器上启用保持活动状态,您是否尝试添加更多通道选项,例如 TCP_KEEPIDLE、TCP_KEEPINTVL 或 TCP_KEEPCNT ?并且可以使用HttpServer.childOption,例如:

        factory.addServerCustomizers(httpServer ->httpServer
                .childOption(ChannelOption.SO_KEEPALIVE, true)
                .childOption(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPIDLE), 60)
                .childOption(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPINTERVAL), 10)
                .childOption(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPCOUNT), 3)
                );

这是用于 Nio 传输的,但如果您使用 Epoll 传输,也有 EpollChannelOption (检查 https://projectreactor.io/docs/netty/1.1.6/reference/index.html#_tcp_level_configuration_2)。

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.