为什么 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 DefaultChannelPipelinefireChannelActivefireChannelReadComplete方法中那样影响

if (channel.config().isAutoRead()) {
    read();
}

但是我还是搞不懂自动读取和代理示例之间的关系。在我看来,当数据发送到入站缓冲区时,Netty 应该触发通道读取事件。

所以有两个问题:

如果您没有将 autoread 设置为 false,那么如果一个通道在另一个通道可以使用之前写入大量数据,您可能会遇到麻烦。由于它都是异步的,因此您最终可能会遇到数据过多的缓冲区并命中 OOME。