EmptyByteBuf出现在Netty服务器的解码器链中

时间:2015-05-17 15:57:22

标签: java netty

Netty版本:5.0.0.Alpha2

这是我如何在管道中添加处理程序/解码器。 (childHandler)

childHandler(ch ->
    ch.pipeline().addLast(
      new LoggingHandler(LogLevel.TRACE),
      new LengthFieldBasedFrameDecoder(2048, 4, 2, -2, 0),
      new MyDecoder2(),
      new Encoder(),
      handler
    )
)

我接下来要做的就是向这台服务器的输入发送一些垃圾。 LengthFieldBasedFrameDecoder抛出TooLongFrameException,在这种情况下是预期的。

但是,MyDecoder2.decode()调用EmptyByteBuf作为输入缓冲区后,调用{F}引发了一个异常。 如果前一个Decoder不返回任何内容,那么EmptyByteBuf来自哪里?

我希望MyDecoder2接收带有正确框架的ByteBuf,由LengthFieldBasedFrameDecoder处理,或者不接收任何内容。

 Caused by: java.lang.IndexOutOfBoundsException: null
        at io.netty.buffer.EmptyByteBuf.checkIndex(EmptyByteBuf.java:866) ~[na:0.0]
        at io.netty.buffer.EmptyByteBuf.getBytes(EmptyByteBuf.java:317) ~[na:0.0]
        at spire.broker.proto.MyDecoder2.decode(MyDecoder2.java:27) ~[na:0.0]
        at io.netty.handler.codec.ByteToMessageDecoder.decodeLast(ByteToMessageDecoder.java:371) ~[na:0.0]
        at io.netty.handler.codec.ByteToMessageDecoder.channelInactive(ByteToMessageDecoder.java:275) ~[na:0.0]

也许我不能正确理解Netty如何处理管道中的解码器链。

1 个答案:

答案 0 :(得分:1)

查看<plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <!-- Tomcat 8 , too --> <version>2.2</version> <configuration> <server>tomcat8-local</server> <url>http://localhost:8080/manager/text</url> <path>/doormanP0</path> </configuration> </plugin> 扩展channelInactive()的{​​{1}}方法的代码:

ByteToMessageDecoder

一旦频道变为非活动状态,它将最后一次使用LengthFieldBasedFrameDecoder调用解码方法。如果您已经制作了自定义解码器,这将使您有机会进行清理。如果您对此不感兴趣,则需要覆盖@Override public void channelInactive(ChannelHandlerContext ctx) throws Exception { RecyclableArrayList out = RecyclableArrayList.newInstance(); try { if (cumulation != null) { callDecode(ctx, cumulation, out); decodeLast(ctx, cumulation, out); } else { decodeLast(ctx, Unpooled.EMPTY_BUFFER, out); } } catch (DecoderException e) { throw e; } catch (Exception e) { throw new DecoderException(e); } finally { ... } } 方法以不执行任何操作。