为什么 Netty 4 "proxy" 示例必须将通道 "AUTO_READ" 设置为 false
Why Netty 4 "proxy" example has to set channel "AUTO_READ" as false
在 Netty 4 "proxy" example 中,通道自动读取选项已被禁用:
serverBootStrap.group(bossGroup, workerGroup)
...
.childOption(ChannelOption.AUTO_READ, false)
如果评论childOption(ChannelOption.AUTO_READ, false)
,代理示例将无法工作。更详细地说,在classHexDumpProxyFrontendHandler
的方法channelRead
中,outboundChannel
将永远处于非活动状态。
并且我研究了Netty源代码,发现"auto read"会像class DefaultChannelPipeline
fireChannelActive
和fireChannelReadComplete
方法中那样影响
if (channel.config().isAutoRead()) {
read();
}
但是我还是搞不懂自动读取和代理示例之间的关系。在我看来,当数据发送到入站缓冲区时,Netty 应该触发通道读取事件。
所以有两个问题:
- 为什么 "proxy" 示例需要禁用自动读取?
- 为什么启用自动读取会使
outboundChannel
始终处于非活动状态?
如果您没有将 autoread 设置为 false,那么如果一个通道在另一个通道可以使用之前写入大量数据,您可能会遇到麻烦。由于它都是异步的,因此您最终可能会遇到数据过多的缓冲区并命中 OOME。
在 Netty 4 "proxy" example 中,通道自动读取选项已被禁用:
serverBootStrap.group(bossGroup, workerGroup)
...
.childOption(ChannelOption.AUTO_READ, false)
如果评论childOption(ChannelOption.AUTO_READ, false)
,代理示例将无法工作。更详细地说,在classHexDumpProxyFrontendHandler
的方法channelRead
中,outboundChannel
将永远处于非活动状态。
并且我研究了Netty源代码,发现"auto read"会像class DefaultChannelPipeline
fireChannelActive
和fireChannelReadComplete
方法中那样影响
if (channel.config().isAutoRead()) {
read();
}
但是我还是搞不懂自动读取和代理示例之间的关系。在我看来,当数据发送到入站缓冲区时,Netty 应该触发通道读取事件。
所以有两个问题:
- 为什么 "proxy" 示例需要禁用自动读取?
- 为什么启用自动读取会使
outboundChannel
始终处于非活动状态?
如果您没有将 autoread 设置为 false,那么如果一个通道在另一个通道可以使用之前写入大量数据,您可能会遇到麻烦。由于它都是异步的,因此您最终可能会遇到数据过多的缓冲区并命中 OOME。