我有一个使用 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
,但它似乎不起作用。
我缺少什么?
谢谢
如果我是对的,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)。
希望这有帮助。