我何时需要在Netty4编码器中调用ByteBuf.retain()方法?

8

我正在编写一个编码器,用于在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));
    }

}
1个回答

9
默认情况下,MessageToMessageEncoder 在编码后会释放原始消息。这与 MessageToMessageEncoder 的典型用法一致,当您的编码器返回新消息作为编码结果时,原始消息可以安全地在编码后丢弃。
然而,在您的情况下,如果原始消息作为结果的一部分被使用,则不应该丢弃原始消息。在这种情况下,您需要显式调用 retain()
MessageToMessageEncoder 的 javadoc中可以了解到:

请注意,如果通过的消息是 ReferenceCounted 类型,则需要调用 ReferenceCounted.retain() 。这是因为 MessageToMessageEncoder 将在编码后调用 ReferenceCounted.release() 来释放已编码的消息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接