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

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

我找到了这个样本 – > 点击最后调用ByteBuf.retain()地方,将现有的ByteBuf写入输出。 他们为什么这样做,为什么需要呢?

这是我的编码器:

 public class FrameEncoder extends MessageToMessageEncoder { @Override protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List out) throws Exception { out.add(msg.retain()); out.add(ctx.alloc().buffer(1).writeByte(NUL)); } } 

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

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

MessageToMessageEncoder的javadoc :

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