为什么Netty 4"代理"示例必须将通道"AUTO_READ"设置为false

Yan*_*fan 8 java netty

在Netty 4 "代理"示例中,通道自动读取选项已被禁用:

serverBootStrap.group(bossGroup, workerGroup)
    ...
    .childOption(ChannelOption.AUTO_READ, false)
Run Code Online (Sandbox Code Playgroud)

如果注释childOption(ChannelOption.AUTO_READ, false),代理示例将无法工作.更详细的是,在channelRead类的方法中HexDumpProxyFrontendHandler,outboundChannel将始终处于非活动状态.

我研究过Netty源代码,发现"自动读取"会影响方法fireChannelActivefireChannelReadComplete类的DefaultChannelPipeline

if (channel.config().isAutoRead()) {
    read();
}
Run Code Online (Sandbox Code Playgroud)

但我仍然无法弄清楚自动读取和代理示例之间的关系.在我看来,当数据发送到入站缓冲区时,Netty应该触发通道读取事件.

所以有两个问题:

  • 为什么禁用自动读取是"代理"示例所必需的?
  • 为什么启用自动读取会使outboundChannel总是无效?

Nor*_*rer 10

如果你没有将autoread设置为false,如果一个通道在另一个通道写入大量数据之前可能会消耗它,则可能会遇到麻烦.因为它都是异步的,所以你可以将缓冲区放到很多数据上并点击OOME.