gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:20:34 27 4
gpt4 key购买 nike

我正在编写一个 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));
}

}

最佳答案

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

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

来自javadoc of MessageToMessageEncoder :

Be aware that you need to call ReferenceCounted.retain() on messages that are just passed through if they are of type ReferenceCounted. This is needed as the MessageToMessageEncoder will call ReferenceCounted.release() on encoded messages.

关于java - 当我必须在 Netty4 编码器中调用 ByteBuf.retain() 时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20612430/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com