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