【问题标题】:Why Netty 4 "proxy" example has to set channel "AUTO_READ" as false为什么 Netty 4“代理”示例必须将通道“AUTO_READ”设置为 false
【发布时间】:2015-04-01 03:17:43
【问题描述】:

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

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

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

并且我研究了Netty源代码,发现“自动读取”会在DefaultChannelPipeline类的方法fireChannelActivefireChannelReadComplete中产生类似的影响

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

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

所以有两个问题:

  • 为什么“代理”示例需要禁用自动读取?
  • 为什么启用自动读取会使outboundChannel 始终处于非活动状态?

【问题讨论】:

    标签: java netty


    【解决方案1】:

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

    【讨论】:

    • 如果 autoread 为 true 可能会导致 OOME。但是为什么启用这个选项会使 Netty 代理示例无法完全工作呢?
    • 问题是,如果你没有设置为 false,你可能在连接到远程对端之前就开始阅读了。
    • 您好 Maurer,所以您的意思是自动读取选项为真将使方法 fireChannelActive 在此通道真正处于活动状态之前调用通道读取事件。然后因为读事件发生得太早,所以数据会丢失。我的理解对吗?
    • 正确...当连接的建立时间过长时会发生这种情况。
    • 但是如果我需要在建立反向连接之前进行身份验证,怎么办?比如,客户端http请求头或者cookie必须有东西
    猜你喜欢
    • 2021-01-14
    • 1970-01-01
    • 2012-06-15
    • 1970-01-01
    • 2014-09-11
    • 2015-10-17
    • 2012-06-09
    • 2017-09-10
    • 1970-01-01
    相关资源
    最近更新 更多