我正在编写一个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)
默认情况下MessageToMessageEncoder release,编码后的原始邮件.MessageToMessageEncoder当您的编码器因编码而返回新消息时,它与典型用例一致,因此在编码后可以安全地丢弃原始消息.
但是,在将其用作结果的一部分时,不应丢弃原始消息,如您的情况.在这种情况下,您需要retain()显式调用.
来自javadocMessageToMessageEncoder:
请注意,如果它们的类型为ReferenceCounted,则需要对刚刚传递的消息调用ReferenceCounted.retain().这是必需的,因为MessageToMessageEncoder将在编码消息上调用ReferenceCounted.release().