为什么选择Netty 4"代理"例子必须设置频道" AUTO_READ"假的

时间:2015-02-02 08:01:19

标签: java netty

在Netty 4 "proxy" example中,频道自动阅读选项已被禁用:

serverBootStrap.group(bossGroup, workerGroup)
    ...
    .childOption(ChannelOption.AUTO_READ, false)

如果注释childOption(ChannelOption.AUTO_READ, false),则代理示例将无法运行。更详细的是,在channelRead类的HexDumpProxyFrontendHandler方法中,outboundChannel始终处于无效状态。

我研究过Netty源代码,发现“自动阅读”会影响类fireChannelActive的方法fireChannelReadCompleteDefaultChannelPipeline

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

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

所以有两个问题:

  • 为什么禁用“代理”示例需要自动读取?
  • 为什么启用自动阅读会使outboundChannel始终无效?

1 个答案:

答案 0 :(得分:7)

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