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

Netty 如何正确使用ByteToMessageCodec.encode和直接缓冲区,netty,direct-buffer,Netty,Direct Buffer,我在我的netty项目中使用了a。编码具有以下结构: 受保护的抽象空编码( ChannelHandlerContext ctx, 我是味精, 比特伯夫酒店 )抛出异常 在我的例子中,msg是一条包含来自另一个通道的directBuffer并要转发的消息 我的问题是: 如果out.iswriteable()为false,那么最佳做法是什么 如果out也是直接缓冲区,那么out.writeBytes(myMessage.directBuffer)是否复制内存 如果它确实复制了内存,我可以调用ct

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

受保护的抽象空编码(
ChannelHandlerContext ctx,
我是味精,
比特伯夫酒店
)抛出异常
在我的例子中,
msg
是一条包含来自另一个通道的directBuffer并要转发的消息

我的问题是:

  • 如果
    out.iswriteable()
    为false,那么最佳做法是什么
  • 如果
    out
    也是直接缓冲区,那么
    out.writeBytes(myMessage.directBuffer)
    是否复制内存
  • 如果它确实复制了内存,我可以调用
    ctx.writeAndFlush(myMessage.directBuffer)
    来防止内存复制吗

关于这个确切的主题有一个很好的说明,但它似乎是内存复制缓冲区,并没有回答我所有的问题。

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

然后你可以做:

protected abstract void encode(ChannelHandlerContext ctx, I msg, List<Object> out) {
    out.add(msg.directBuffer);
}
受保护的抽象无效编码(ChannelHandlerContext ctx、I消息、列表输出){
out.add(msg.directBuffer);
}

这将阻止任何内存复制。

如果使用直接缓冲区填充的复合缓冲区,是否也会阻止内存复制?