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