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

Java 当我必须在Netty4编码器中调用ByteBuf.retain()时?,java,netty,Java,Netty,我正在编写一个编码器,NUL终止JSON消息,以便在消息碎片化的情况下对其进行解码 我发现这个示例->其中最后调用了ByteBuf.retain(),以将现有的ByteBuf写入输出。他们为什么这样做,为什么需要这样做 这是我的编码器: public类FrameEncoder扩展MessageToMessageEncoder{ @凌驾 受保护的void encode(ChannelHandlerContext ctx、ByteBuf msg、List out)引发异常{ out.add(msg

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

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

这是我的编码器:

public类FrameEncoder扩展MessageToMessageEncoder{
@凌驾
受保护的void encode(ChannelHandlerContext ctx、ByteBuf msg、List out)引发异常{
out.add(msg.retain());
add(ctx.alloc().buffer(1.writeByte(NUL));
}
}

默认情况下
消息到消息编码
在编码后释放原始消息。它与
MessageToMessageEncoder
的典型用例一致,即编码器在编码后返回新消息,因此编码后可以安全地丢弃原始消息

然而,当原始消息作为结果的一部分使用时,不应该像您的情况那样丢弃它。在这种情况下,需要显式调用
retain()

从:

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

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));
    }

}