Reactor Netty客户端如何在内部决定使用哪个Channel对象



我已经创建了一个HttpClient类的对象(来自Reactor Netty jar(,并使用此httpClient创建了Webclient类的对象,如下所示:


HttpClienthttpClient= HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.option(ChannelOption.SO_KEEPALIVE, true)
.option(EpollChannelOption.TCP_KEEPIDLE, 300)
.option(EpollChannelOption.TCP_KEEPINTVL, 60)
.option(EpollChannelOption.TCP_KEEPCNT, 8)
.doOnConnected(//custom stuff);

Webclient webclient = WebClient.builder()
.baseUrl()
.defaultHeader()
.codecs(
configurer ->{
configurer.defaultCodecs().jaxb2Encoder(new Jaxb2XmlEncoder());
configurer.defaultCodecs().jaxb2Decoder(new Jaxb2XmlDecoder());
})
.clientConnector(new ReactorClientHttpConnector(httpClient)
.build();

Then I'm using this WebClient to make a POST API request.

Although I'm getting the API response correctly, I was getting below warnings in the logs:

Unknown channel option 'io.netty.channel.epoll.EpollChannelOption#TCP_KEEPIDLE' for channel '[id: 0x76c8c652]'
Unknown channel option 'io.netty.channel.epoll.EpollChannelOption#TCP_KEEPCNT' for channel '[id: 0x76c8c652]'
Unknown channel option 'io.netty.channel.epoll.EpollChannelOption#TCP_KEEPINTVL' for channel '[id: 0x76c8c652]'

上面警告中的属性(TCP_KEEPIDLE, TCP_KEEPCNTTCP_KEEPINTVL等(是在HttpClient对象创建代码中设置的,如上面的代码所示。

我对此进行了调试,发现警告是在reactor netty jar中的
TransportConnector.setChannelOptions(Channel channel, Map<ChannelOption<?>, ?> options, boolean isDomainSocket)方法中生成的。

而发出警告的原因是因为上述方法中的Channel对象是NioSocketChannel的对象。在阅读了reactor netty文档后,我意识到如果通道是NioSocketChannel,那么我们需要将配置从EpollChannelOption更改为NioChannelOption,如下所示:



HttpClient httpClient = HttpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000)
.option(ChannelOption.SO_KEEPALIVE, true)
.option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPIDLE), 300)
.option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPINTERVAL), 60)
.option(NioChannelOption.of(ExtendedSocketOptions.TCP_KEEPCOUNT), 8)
.doOnConnected(//custom stuff);

在上述更改后运行良好,因为现在没有警告。

然而,我的问题需要澄清:

这个确切的项目在我们的一个生产环境中运行良好。此外,从日志中,我可以看到生产中的底层channelEpollSocketChannelConfig,而我的本地channelNioSocketChannel

在什么情况下,对于相同的代码库,底层Channel可能不同?

我在代码库中的任何地方都没有使用过runOn方法。

关于我的设置的一些信息:我的本地是Mac M1,频道是NIO鉴于生产运行的是Linux,其中Channel是NIO。

这两台机器中的java版本都是java 11。

请帮助

Netty提供特定于平台的JNI传输。我只看到linux-x86_64体系结构对netty-transport-native-epoll的依赖性。这很可能就是您在Macosx-aarch_64上看到此类警告的原因。

请参阅https://netty.io/wiki/native-transports.html和https://projectreactor.io/docs/netty/release/reference/index.html#connection-超时

相关内容

最新更新