我已经创建了一个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_KEEPCNT
、TCP_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);
在上述更改后运行良好,因为现在没有警告。
然而,我的问题需要澄清:
这个确切的项目在我们的一个生产环境中运行良好。此外,从日志中,我可以看到生产中的底层channel
是EpollSocketChannelConfig
,而我的本地channel
是NioSocketChannel
。
在什么情况下,对于相同的代码库,底层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-超时