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

Chr*_*iss 7 java netty

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

我发现这个样品- > 点击这里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));
    }

}
Run Code Online (Sandbox Code Playgroud)

axt*_*avt 8

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

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

来自javadocMessageToMessageEncoder:

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