【问题标题】:Netty pipeline warningNetty 管道警告
【发布时间】:2016-11-26 18:29:31
【问题描述】:

Netty 4 发出警告“丢弃 1 条到达管道末端的入站消息。请检查您的管道配置”。这是什么意思?应该如何处理? (以前reproduced here 直到根据接受的答案解决,但我宁愿对它的含义和管道如何工作有一个一般性的解释)

为了最大化netty反馈,客户端管道设置如下:

pipeline.addLast("logger", new LoggingHandler(LogLevel.TRACE))
pipeline.addLast("HttpRequestEncoder", new HttpClientCodec)
pipeline.addLast("handler", new myHandler)

当 Netty 发送两条 http 消息并被服务器端成功接收和确认时,我在客户端登录的所有内容是:

12 [main] DEBUG io.netty.util.internal.InternalLoggerFactory  - Using Log4J as the default logging framework
164 [nioEventLoopGroup-1-2] DEBUG io.netty.channel.nio.SelectorUtil  - Using select timeout of 500
164 [nioEventLoopGroup-1-2] DEBUG io.netty.channel.nio.SelectorUtil  - Epoll-bug workaround enabled = false
229 [nioEventLoopGroup-1-2] WARN io.netty.channel.DefaultChannelPipeline  - Discarded 1 inbound message(s) that reached at the end of the pipeline. Please check your pipeline configuration.
230 [nioEventLoopGroup-1-2] WARN io.netty.channel.DefaultChannelPipeline  - Discarded 1 inbound message(s) that reached at the end of the pipeline. Please check your pipeline configuration.

而日志记录是这样设置的:

BasicConfigurator.configure       
InternalLoggerFactory.setDefaultFactory(new Log4JLoggerFactory)

【问题讨论】:

    标签: netty


    【解决方案1】:

    在 Netty 4 中,用于服务器或客户端的 HTTP 解码器总是为每个 HTTP 消息生成多个消息对象:

    1       * HttpRequest / HttpResponse
    0 - n   * HttpContent
    1       * LastHttpContent
    

    换句话说:

    • 服务器接收 1 个 HttpRequest、0-n 个 HttpContent(s) 和 1 个 HttpLastContent
    • 客户端收到 1 个 HttpResponse、0-n 个 HttpContent(s) 和 1 个 HttpLastContent。

    因此,如果您的处理程序仅使用 HttpRequest/HttpResponse,则其他消息将到达管道的末尾。您需要使用它们,这是您的管道“配置错误”的地方。

    您可以将 HttpObjectAggregator 添加到您的管道中,以便生成 FullHttpRequest/FullHttpResponse 消息:

    pipeline.addLast( "http-aggregator", new HttpObjectAggregator( MAX_SIZE ) );
    

    但这意味着整个请求或响应,包括正文实体,在调用您的处理程序之前已加载。也许你不想那样,YMMV。

    【讨论】:

    • 那么客户端怎么会发出丢弃消息警告呢?您的回答是否暗示问题出在服务器端的解码器上?我错过了什么?谢谢!
    • 据我了解,服务器和客户端都是如此。两者都使用 HttpCodec 并以相同的方式工作。我编辑了我的答案以明确这一点。
    • 不确定这如何适用于编辑后的答案中的客户端(您是说客户端从服务器接收到 LastHttpContent 对象,使其发出警告?)。我希望客户端收到 http 响应,而不是 http 请求。
    • 是的,在我的回答中有一个地方我没有将 HttpResponse 放在 HttpRequest 旁边。我再次对其进行了编辑以解决该问题,并添加了一些内容以明确表明服务器或客户端无关紧要(只需将 *Request 交换为 *Response)。
    • 感谢您的信息。 MAX_SIZE 应该是多少?
    【解决方案2】:

    Netty 4 自动在您创建的管道上添加最后一个处理程序,如果事件到达最后一个处理程序,它将通过消息。您的最后一个入站处理程序不应触发上下文事件。

    删除这个: ctx.fireChannelRead(msg);

    【讨论】:

      【解决方案3】:

      @eskatos 是对的,pipeline 的 handler 处理基于类型匹配,例如SimpleChannelInboundHandler<HttpContent> 只会处理 HttpContent,如果你还没有处理 HttpReponse(在你的 pipeline 中添加SimpleChannelInboundHandler<HttpReponse>),Netty 会警告:Content -长度:<length> 到达管道的尾部。请检查您的管道配置。

      因此,解决方案是将相应的ChannelInboundHandler/ChannelOutboundHandler 添加到您的管道中。

      但你需要先知道 Handler 缺少什么类型: 找到 DefaultChannelPipeline 的 channelRead 方法并对其进行调试以获取包含消息丢失内容的 msg.content().toString()。

      还有一点,@Norman Maurer 提到启用调试日志记录不起作用,因为 channelRead 方法不会记录 msg 内容中的内容。

      这里的DefaultChannelPipeline的channelRead方法(Netty 4.1):

          @Override
          public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
              try {
                  logger.debug(
                          "Discarded inbound message {} that reached at the tail of the pipeline. " +
                                  "Please check your pipeline configuration.", msg);
              } finally {
                  ReferenceCountUtil.release(msg);
              }
          }
      

      【讨论】:

        【解决方案4】:

        这意味着一条消息到达了管道的末端,并且没有“入站处理程序”能够处理它。这在大多数情况下会在 ChannelPipeline 中显示“配置”错误。

        【讨论】:

        • 谢谢,这或多或少是我认为的意思,但我正在寻找有关如何探索解决方案的建议。在我的情况下(如运行 main.scala 的 repo 中所见),管道在发送方和接收方都为 http 设置,并且发送的消息是 http。你能建议如何探索它吗? “配置错误”是一个非常通用的概念。也可以以某种方式提取据称未处理的消息吗?
        • 在netty中启用调试日志,它应该记录什么样的消息被丢弃
        • 在问题正文中添加了日志输出。那里没有得到太多的日志信息。我应该以不同的方式启用日志记录吗?
        • Netty 在 DEBUG 级别记录丢弃的入站消息。使用 4.0.0.Beta3 我得到这个日志:“”“调试 io.netty.channel.DefaultChannelPipeline - 丢弃的入站消息 io.netty.handler.codec.http.LastHttpContent$1@b68d372 到达管道末端。请检查您的管道配置。"""
        猜你喜欢
        • 2017-08-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 2013-01-16
        • 1970-01-01
        • 2018-04-14
        • 1970-01-01
        相关资源
        最近更新 更多