如何正确使用 ByteToMessageCodec.encode 和直接缓冲区

How do I correctly work with ByteToMessageCodec.encode and direct buffers

我在我的 netty 项目中使用 ByteToMessageCodec。编码具有以下结构:

protected abstract void encode(
    ChannelHandlerContext ctx,
    I msg,
    ByteBuf out
) throws Exception

在我的例子中,msg 是一条包含 directBuffer 的消息,该缓冲区来自另一个通道,将被转发。

我的问题:

有一个 source by norman maurer 讲述了关于这个确切主题的一些事情,但它似乎记忆复制了缓冲区并且没有回答我所有的问题。

您根本不应该使用 ByteToMessageCodec,在这种情况下只需使用 MessageToMessageEncoder

那么你可以这样做:

protected abstract void encode(ChannelHandlerContext ctx, I msg, List<Object> out) {
    out.add(msg.directBuffer);
}

这将防止任何内存复制。