当我必须在Netty4编码器中调用ByteBuf.retain()时?

时间:2013-12-16 13:44:26

标签: java netty

我正在编写一个NUL-终止JSON消息的编码器,以便在消息碎片化时对其进行解码。

我找到了这个示例 - > click,最后调用ByteBuf.retain()将现有的ByteBuf写入输出。他们为什么这样做,为什么需要呢?

这是我的编码器:

public class FrameEncoder extends MessageToMessageEncoder<ByteBuf> {

    @Override
    protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> out) throws Exception {
        out.add(msg.retain());
        out.add(ctx.alloc().buffer(1).writeByte(NUL));
    }

}

1 个答案:

答案 0 :(得分:8)

编码后默认为MessageToMessageEncoder release个原始邮件。当编码器因编码而返回新消息时,它与MessageToMessageEncoder的典型用例一致,因此可以在编码后安全地丢弃原始消息。

但是,在将其用作结果的一部分时,不应丢弃原始消息,如您的情况。在这种情况下,您需要明确调用retain()

来自javadoc of MessageToMessageEncoder

  

请注意,如果它们的类型为ReferenceCounted,则需要对刚刚传递的消息调用ReferenceCounted.retain()。这是必需的,因为MessageToMessageEncoder将在编码消息上调用ReferenceCounted.release()。